java的子类继承父类,在初始化时,初始化子类可读取父类的方法,但如果初始化父类,则不可读取子类的方法。
创建对象时,Father c = new Child() 子类继承父类时,针对覆写的方法,调用的是子类方法,在静态属性上,不存在覆写,还是用的是父类的属性
public class Father {
protected int age;
public Father(){
age=38;
}
void eat(){
System.out.println("父亲吃饭");
}
}
public class Child extends Father {
protected int age;
public Child(){
age=18;
}
@Override
void eat(){
System.out.println("孩子吃饭");
// super.eat(); 使用的是父类的该方法
}
void play(){
System.out.println("孩子玩游戏");
}
}
public class Test {
public static void main(String[] args) {
Father c = new Child();
c.eat(); //输出为 “孩子在吃饭” 因为复写了父类的eat方法
// c.play();
System.out.println("年龄:"+ c.age); //输出为“年龄:40” 属性/变量不存在重写和覆盖
}
}
在父类子类加载顺序上,大致可以分为
1.父类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
2 .子类静态代码块 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
3.父类属性对象初始化
4.父类普通代码块(每次new,每次执行)
5.父类构造函数(每次new,每次执行)
6.子类属性对象初始化
7.子类普通代码块(每次new,每次执行)
8.子类构造函数(每次new,每次执行)
9.子类重写父类方法,调用时会调用子类重写之后的方法
public class A {
public static String AAA = "A静态代码";
public A(){
System.out.println("A");
}
B b = new B();
}
public class B {
public static String BBB = "B静态代码";
public B(){
System.out.println("B");
}
}
public class C extends A {
public static String CCC = "C静态代码";
B b = new B();
public C(){
System.out.println("C");
}
public static void main(String[] args) {
new C();
}
}
运行结果BABC
进入程序后,先进入C类的父类,在A类中先加载了new B()方法【输出B】,然后执行A的构造方法【输出A】,进入C类,执行C的new B()【输出B】,执行C的构造方法【输出C】