不完全与大话设计模式相同,结合了java与个人的理解。
对象与类
对象是一个自包含的实体,用一组可识别的特性和行为来标识。
类是具有相同的属性和功能的对象的抽象的集合。
很好理解,举个例子:
public class User {
private String name;
private int age;
// getter/setter...
}
User就是一个类。
User user1 = new User();
User user2 = new User();
user1和user2就是两个实例,或者两个对象。实例就是一个真实的对象。
new User()
这个操作就是把一个对象实例化。
这个操作实际可以拆分成两部:
- 声明一个对象
User user1
- 将对象实例化
user1 = new User()
构造方法
构造方法,又叫构造函数,其实就是对类进行初始化。构造方法与类同名,无返回值,也不需要void,在new的时候调用。
例如上述的new User()
操作,User()
就是构造方法。
所有的类都有构造方法,如果你不编码,则系统默认生成空的构造方法,若你有定义的构造方法,那么默认的构造方法就会失效。
将上述的User类进行调整,调整后如下:
public class User {
private String name;
private int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
// getter/setter...
}
此时再使用new User()
时会有报错,因为此时该类已有构造方法,默认的空的构造方法就会失效。应该采用new User("张三",20)
的方法进行对象的实例化。
方法重载
方法重载提供了创建同名的多个方法的能力,但这些方法需使用不同的参数类型。
简单来说就是方法名相同,参数类型不同。
继续对上述User类进行改造:
public class User {
private String name;
private int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
public User(){
}
public User(String name){
this.name = name;
}
// getter/setter...
}
User()
构造方法、User(String name)
构造方法,都是是对User(String name,int age)
构造方法进行了重载。这样new User()
、new User("张三")
、new User("张三",20)
都可以对对象进行实例化。
方法重载的意义在于,可以在不改变原方法的基础上,新增功能。
属性与修饰符
属性是一个方法或一对方法,但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合。
简单来说,上述User
类中,name
和age
就是两个属性。
public和private都是修饰符。public表示它所修饰的类成员可以允许其他任何类来访问,俗称公有的。而private表示只允许同一个类中的成员访问,其他类包括他的子类无法访问,俗称私有的。
属性有两个方法get和set。get访问器没有显示设置参数,返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;set访问器有一个和属性相同数据类型的参数,它的作用是调用属性时可以给内部的字段或引用赋值。
继续完善上述User类:
public class User {
private String name;
private int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
在实际开发过程中,类的属性一般都用private来修饰,调用方法采用public来修饰,为了防止外部直接对对象进行操作。比如修改后的User
类,当业务逻辑为:
只允许实例化一个用户时对用户进行命名(即name的赋值)操作,命名完成后,只允许修改年龄,不允许修改姓名
时,如果name采用public修饰,则无法对name属性进行有效的控制。
例如定义一个用户User zhangsan = new User("张三", 18)
,
当需要获取用户姓名时,可以调用zhangsan.getName()
方法,由于name属性是private,所以不能通过zhangsan.name = "李四"
操作对姓名进行修改。而当需要将年龄修改为时,由于有age属性有相应的public修饰的set方法可以调用,所以可以采用zhangsan.setAge(20)
方法进行修改。