java -- 继承

102 阅读3分钟

继承的本质:复用已存在的字段和域

继承:子类继承父类的行为特征,使得子类实例具有父类的实例和域


Student类继承了Person类,Student new出来的实例,就可以直接调用run方法。

public class Person {
	
	public void run() {
		System.out.println("任何人都可以跑。。。");
	}
}

class Student extends Person{
	
	private void eat() {
		System.out.println("学生正在吃。。。。");
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.run();
		student.eat();
	}
	
}

子类可以调用父类的方法,但是父类不可以调用子类的方法。子类比超类功能更加的丰富。



方法的重载和重写

1、方法重载

方法具有相同的名字,但是方法的参数列表,返回值不同就产生了方法的重载



方法重写

方法重写,一般是说子类重写父类或者接口的方法,就是在父类里定义了方法,在子类中写的方法参数列表,返回值全部相同就实现了方法的重写。

此时调用run方法,就是调用的子类的run方法。子类重写了父类的run方法。

public class Person {
	
	public void run() {
		System.out.println("任何人都可以跑。。。");
	}
}

class Student extends Person{
	public void run() {
		System.out.println("这个学生在跑。。。");
	}
	
	private void eat() {
		System.out.println("学生正在吃。。。。");
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.run();
		student.eat();
	}
	
}

重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序

不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父

类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类

方法访问修饰符为 private 则子类就不能重写该方法。



关键字super:可以调用父类的构造方法,要放到子类的方法中,可以调用父类的构造方法和普通方法。调用构造方法时,调用构造器语句的时候只能作为另一个构造器的第一条语句出现。

package test;

public class Person {

      public void run() {
        System.out.println("任何人都可以跑。。。");
    }
    public static void get() {
        System.out.println("getda。");
    }
}

class Student extends Person{
    public void run() {
        super.run();
        System.out.println("这个学生在跑。。。");
    }

    private void eat() {
        System.out.println("学生正在吃。。。。");
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.run();
        student.eat();
        get();

    }

}

由一个公共超类派生出来的所有类的集合被称为继承层次,在继承层次当中,从某个特定的类到其祖先的路径被称为继承链,但是一定要注意java是单继承的。


类的加载顺序

程序的运行首先会去找main方法,找到main方法,发现new Test的实例,然后去找Test类,加载Test类时,发现继承了Base类,然后去加载Base类,在Base中先执行static块,然后回到Test类执行static块。加载完俩个类后,回到主程序,再调用构造方法。先调用父类的构造方法,然后再调用子类的构造方法。

package test;

public class Test extends Base{

    static{
        System.out.println("test static");
    }

    public Test(){
        System.out.println("test constructor");
    }

    public static void main(String[] args) {
        new Test();
    }
}

class Base{

    static{
        System.out.println("base static");
    }

    public Base(){
        System.out.println("base constructor");
    }
}