Java10-java语法基础(九)——java的封装性
一、Java的三大特性:封装、多态、继承
封装:通过类封装对象的数据成员和成员方法,保证只有可信的类或者对象能够访问这些方法和数据成员,对不可信的类或者对象进行信息隐藏。
继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据成员和方法,并能扩展新的能力。
多态:多态性是指不同的对象,收到同一消息可以产生不同的结果。
二、面向对象编程的封装性
封装的实现:通过private关键字实现
1、封装数据成员和成员方法
(1)封装数据成员:一般情况下,没有特殊说明,类的数据成员都是私有的
private 数据类型 数据成员名称;
(2)封装成员方法:一般情况下,没有特殊说明,类的成员方法不要私有,否则就没有可以访问类的途径
private 方法返回值 方法名(参数列表){}
private 类名(参数){} —— 封装构造方法
三、访问控制修饰符
1、private:私有的,只能在类的内部访问;
2、protected:保护的,在类的内部、子类中、同一个包中;
2.5、默认的:在类的外部、子类、同一包中;
3、public:公有的,在任何地方都可以访问。
注意:任何一个java文件中,只能有一个公共主类:public class 类名(){},再写其他类不能加public,可以写class Test(){}
四、setter和getter方法
如何在类的外部访问私有数据成员?
访问:public String getName(){return name;}
修改:public void setName(String name){this.name = name;}
注:
(1)eclipse自动生成get和set方法:右键——source——Generate Getters and Setters…
(2)字段就是数据成员(成员变量)
四、getters和setters方法作用:为用户提供了在类的外部访问类的私有数据成员的方法
1、setters:设置私有数据成员的值
格式:public void set私有数据成员名(私有数据成员类型名 要修改成的私有数据成员名){私有数据成员名 =要修改成的私有数据成员名;}
public void setName(String name) {
this.name = name;
}
2、getters:获取数据成员的值
格式:public String getName(){return私有数据成员名;}
public String getName() {
return name;
}
五、this关键字——代表当前对象
作用:
1、引用本类的数据成员和成员方法:
this.数据成员名
this.成员方法名([参数])
2、调用本类的构造方法
this.构造方法名([参数])
注意:在一个构造方法中,若用this调用另一个构造方法,则它必须是这个构造方法中的第一条语句;
问题:super()和this()为什么一定要在第一行?
super()在第一行的原因就是: 子类有可能访问了父类对象, 比如在构造函数中使用父类对象的成员函数和变量, 在成员初始化使用了父类, 在代码块中使用了父类等, 所以为保证在子类可以访问父类对象之前要完成对父类对象的初始化。
this()在第一行的原因就是: 为保证父类对象初始化的唯一性. 我们假设一种情况, 类B是类A的子类, 如果this()可以在构造函数的任意行使用, 那么会出现什么情况呢? 首先程序运行到构造函数B()的第一行, 发现没有调用this()和super(), 就自动在第一行补齐了super() , 完成了对父类对象的初始化, 然后返回子类的构造函数继续执行, 当运行到构造函数B()的"this(2) ;"时, 调用B类对象的B(int) 构造函数, 在B(int)中, 还会对父类对象再次初始化! 这就造成了对资源的浪费, 当然也有可能造成某些意想不到的结果, 不管怎样, 总之是不合理的, 所以this() 不能出现在除第一行以外的其他行!
3、使用this的情况
(1)形式参数名与类数据成员名重名时;
(2)方法的局部变量名与类的变量同名时;
(3)在一个构造方法中,调用类的另一个构造方法时,也就是表示当前对象。