继承的本质:复用已存在的字段和域
继承:子类继承父类的行为特征,使得子类实例具有父类的实例和域
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");
}
}