继承的好处
* a:提高了代码的复用性
* b:提高了代码的维护性
* c:让类与类之间产生了关系,是多态的前提
继承的弊端
* 类的耦合性增强了。
* 开发的原则:高内聚,低耦合。
* 耦合:类与类的关系
* 内聚:就是自己完成某件事情的能力
Java中类的继承特点
* a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
* 有些语言是支持多继承,格式:extends 类1,类2,...
* b:Java支持多层继承(继承体系)
案例演示
* Java中类的继承特点
* 如果想用这个体系的所有功能用最底层的类创建对象
* 如果想看这个体系的共性功能,看最顶层的类
继承的注意事项
* a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
* b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
* a:提高了代码的复用性
* b:提高了代码的维护性
* c:让类与类之间产生了关系,是多态的前提
继承的弊端
* 类的耦合性增强了。
* 开发的原则:高内聚,低耦合。
* 耦合:类与类的关系
* 内聚:就是自己完成某件事情的能力
Java中类的继承特点
* a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)
* 有些语言是支持多继承,格式:extends 类1,类2,...
* b:Java支持多层继承(继承体系)
案例演示
* Java中类的继承特点
* 如果想用这个体系的所有功能用最底层的类创建对象
* 如果想看这个体系的共性功能,看最顶层的类
继承的注意事项
* a:子类只能继承父类所有非私有的成员(成员方法和成员变量)
* b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。
* c:不要为了部分功能而去继承
this和super都代表什么
* this:代表当前对象的引用,谁来调用我,我就代表谁
* super:代表当前对象父类的引用
this和super的使用区别
* a:调用成员变量
* this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
* super.成员变量 调用父类的成员变量
* b:调用构造方法
* this(...) 调用本类的构造方法
* super(...) 调用父类的构造方法
* c:调用成员方法
* this.成员方法 调用本类的成员方法,也可以调用父类的方法
* super.成员方法 调用父类的成员方法
子类中所有的构造方法默认都会访问父类中空参数的构造方法
为什么呢?
* 因为子类会继承父类中的数据,可能还会使用父类的数据。
* 所以,子类初始化之前,一定要先完成父类数据的初始化。
* 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
class Extends{
public static void main(String[] args){
Son s = new Son();
s.setName("李四");
System.out.println("--------------------------");
Zi z = new Zi();
/*
1、jvm调用了main方法,main进栈
2、遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,在创建对象,
当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,当Zi.class加载
进内存,子类的静态代码块会随着Zi.class一起加载第一个输出,静态代码块Fu,第二个
输出静态代码块Zi
3、走Zi类的构造方法,因为Java中分层初始化的,先初始化父类,在初始化子类,所以先走
的父类,但是执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的,
所以第三个输出构造代码块Fu,第四个输出构造方法Fu
4、Fu类初始化结束,子类初始化,第五个输出构造代码块Zi,构造方法Zi
*/
}
}
class Father{
private String name;
private int age;
public Father(){
System.out.println("Father 空参构造方法");
}
public Father(String name,int age){
System.out.println("Fathe 有参构造方法");
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
class Son extends Father{
public Son(){
super(); //系统默认加上,用来访问父类中的空参构造
System.out.println("Son 空参构造方法");
}
public Son(String name,int age){
System.out.println("Son 有参构造方法");
}
}
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}