day07【面向对象基础–中】
封装
高内聚:类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:仅对外暴露少量的方法用于使用
如何实现封装
使用权限修饰符来控制:边界有
类,包,子类,模块(Java9之后引入)
权限修饰符:
修饰符 | 本类 | 本包 | 其他包子类 | 其他包非子类 | 其他模块 |
---|---|---|---|---|---|
private | √ | × | × | × | × |
缺省 | √ | √ | × | × | × |
protected | √ | √ | √ | × | × |
public | √ | √ | √ | √ | 默认不可以,可以建立依赖 |
成员变量/属性私有化问题
成员变量私有化之后,提供标准的get/set方法,这种成员变量也称为属性,
只要能通过get/set操作的就是事物的属性,哪怕没有对应的成员变量
实现步骤
使用 private 修饰成员变量
private 数据类型 变量名;
提供 get/set 方法
public class chinese{
private static String country;
private String name;
private int age;
private boolean marry;
public static void setCountry(String c){
country = c;
}
public static void getCountry(){
return country;
}
}
局部变量与成员变量同名
当局部变量与类变量(静态成员变量)同名时,在类变量面前加类名.
当局部变量与实例变量(非静态成员变量)同名时,在实例变量面前加**“this.”**
构造器
构造器的作用
在创建对象的时候为实例变量赋初始值
造器又称为构造方法,那是因为它长的很像方法。但是和方法还有有所区别的。
【修饰符】 构造器名(){
// 实例初始化代码
}
【修饰符】 构造器名(参数列表){
// 实例初始化代码
}
当一个类有带参构造方法后,一定要给出一个无参构造方法。方便这类被继承。
子类可以继承父类所有属性和方法,构造方法不能继承。
子类也可以拥有自己的属性和方法,创建对象之后,这些属性和方法都可以正常使用。
调用父类无参的构造方法。java语法规定,子类必须在自己构造方法的第一行调用父类的构造方法。
如果父类有多个构造方法,那么调用哪个都行。
super();// 在没有显示写出任何一句调用父类构造方法的时候,将默认隐示调用父类无参的构造方法。
调用的是谁的方法,访问的就是谁属性,方法访问属性就近原则。
当调用一个方法的时候,方法需要访问属性,会先从本类开始搜索属性,找到后访问。
如果方法访问的时候找不到对应的属性,会向父类中搜索对应属性。
继承
通过 extends
关键字,可以声明一个子类继承另外一个父类,定义格式如下:
【修饰符】 class 父类 {
...
}
【修饰符】 class 子类 extends 父类 {
...
}
子类可以继承父类所有属性和方法,构造方法不能继承。
子类也可以拥有自己的属性和方法,创建对象之后,这些属性和方法都可以正常使用。
构造方法
构造方法:
长相特殊,跟类同名,并且没有返回类型
构造方法只能在创建对象的时候调用且仅能调用一次
当一个类中没有显示的构造方法的时候,会自动配备一个默认无参的构造方法。
如果类中出现任何一个显示的构造方法,那么这个默认无参的构造方法就消失了。
方法重载
在同一个类中,方法名相同,参数组不同。(参数组的不同包含:参数类型不一致,参数个数不一致,参数顺序不一致)
局部变量可以和属性重名,局部变量拥有更高的优先级。
在局部变量和属性重名的情况下,使用this.的就是属性。
调用父类无参的构造方法
// 当一个类有带参构造方法后,一定要给出一个无参构造方法。方便这类被继承。
public Pet(){
}
java语法规定,子类必须在自己构造方法的第一行调用父类的构造方法。
如果父类有多个构造方法,那么调用哪个都行。
在没有显示写出任何一句调用父类构造方法的时候,将默认隐示调用父类无参的构造方法。
调用的是谁的方法,访问的就是谁属性,方法访问属性就近原则。
当调用一个方法的时候,方法需要访问属性,会先从本类开始搜索属性,找到后访问。
如果方法访问的时候找不到对应的属性,会向父类中搜索对应属性。
方法重写
方法重写需要在父子类中,子类编写一个和父类一模一样的方法(方法名和参数组完全一致)
方法重写是一个方法,子类重写了父类的方法,那么以后再调用的都是子类的方法。
必须在子类的方法中使用super关键字调用已经被重写的父类的方法。
如果子类重写过父类的方法,那么子类对象调用出来的一定是子类的方法