1.继承
作用:利于代码的重用。
引入: 多个类中,有相同的代码,不想写了,但是还想用,怎么办?
实现步骤:
A.把多个类中,相同的属性和行为提取出来,放到一个单独的类里,这个类就叫做父类。
B.把特有的属性和行为 放在各自的类里,这些各自的类 叫子类
c.在子类名的后面写 extends 父类名,就实现了继承。
然后父类里的资源,子类对象就可以使用了。
2.方法重写:
父类的方法体,已经不能满足子类的需求了,子类可以重写方法。
方法重写: VS 方法重载
子类 本类下
方法名相同 方法名相同
参数列表相同 参数列表不同
返回值相同/缩小 返回值无关
访问修饰符相同/扩大 访问修饰符无关
3.java里继承的方式有两种:
隐式继承:A ===》Object
显式继承:A extends B B extends C
4.继承的特性:
A.传递性: A extends B B extends C ; A可以用C的资源了
B.单根性: 一个类只能继承于一个父类。
5.子类 不能继承父类的什么 === 构造方法!
6.继承关系下,权限修饰符的使用范围:
本类 同包类 同包子类 非同包类 非同包子类
public V 对象名.资源V 直接用/super.资源V 导包后 对象名.资源V 导包后 对象名.资源V
protected V 无论是否有继承关系,对象名.资源V 直接用/super.资源V 不能用!X 导包后 直接用/super.资源V
默认的 V 无论是否有继承关系,对象名.资源V 直接用/super.资源V 不能用!X 不能用!X
private v X X X X
7. super VS this
父类对象 子类对象
可以调用属性/方法/构造器 可以调用属性/方法/构造器(要求是第一行)
super.方法/属性 ==区分;搜索效率高
super();---调用父类的无参构造
super("张三",23);---调用父类的有参构造
===也要求是子类构造方法里的第一行
8.Object类: 所有类的根基类!
toString(); ===>实体类 最好都要重写toString();
源码中: getClass().getName() + "@" + Integer.toHexString(hashCode());
获得当前对象所属类的[全局限定名] +@ + 当前对象堆存储地址计算生成的哈希码 转成的16进制字符串。
程序中, 对象名.toString(); 想把自己的属性 连接成字符串,输出展示给用户看。
所以需要对Obejct类中的toString()进行重写!
System.out.println(demo.toString());
System.out.println(demo); //输出对象时,会自动调用toString()方法。
equals(); Object类中源码是比较地址;
关系运算符: 基本数据类型 ==
引用数据类型 ==
hashCode(); object类中源码是 把对象的内存地址 转成 整数;
public boolean equals(Person person) {
if(this.id.equals(person.getId())
&& this.age==person.getAge()
&& this.name.equals(person.getName())
&& this.sex.equals(person.getSex())){
return true;
}else{
return false;
}
}
public int hashCode(){
return this.id.hashCode() +this.sex.hashCode()
+this.name.hashCode()+this.age;
}
9.继承条件下 构造代码的执行顺序:
A.先执行父类的构造方法(),在执行子类的构造方法
===父类构造方法,可以是子类通过super()指定的;
也可以程序自动调用的父类无参构造;系统没法帮忙调用有参构造!
B.在有静态变量,静态代码快,构造代码块,构造方法时候:
静态资源(父类的静态变量>父类静态代码块 >子类的静态变量 >子类静态代码块)
父类构造代码块 >父类的构造方法>子类的构造代码块>子类构造方法。
10.类和类之间的关联关系:
继承 extends
实现
依赖关系: 参数
关联关系: 属性 三层架构