1JAVA的隐藏和覆盖
隐藏:若B隐藏了A的变量或方法,那么B不能访问A被隐藏的变量或方法,但将B转换成A后可以访问A被隐藏的变量或者方法。
覆盖:若B覆盖了A的变量或者方法,那么不仅B不能访问A被覆盖的变量或者方法,将B转换成A后同样不能访问A被覆盖的变量或者方法。
2JAVA继承隐藏和覆盖规则
- 变量只能隐藏不能被覆盖,这其中包括静态变量和非静态的成员变量
- 静态方法会表现为隐藏
- 子类非静态的实例方法会自动覆盖父类被重写的方法
- 父类的final关键字的方法不能被重写,变量的值不能被改变。
3JAVA类的初始化流程
3.1没有继承时初始化流程
静态成员变量》静态代码块》成员变量》非静态代码块》构造器
3.2有继承时初始化流程
父类静态变量----->子类静态变量---->父类非静态成员变量--->父类非静态代码块--->父类构造---->子类非静态成员变量-->子类非静态代码块--->子类构造
4代码测试
4.1class父类
public class Class {
static String static_v="static class";
String v_class="父类成员变量 class ";
static {
System.out.println(static_v);
}
{
System.out.println(v_class+"代码块");
}
public Class() {
System.out.println("构造器:class");
}
public void run(){
System.out.println("this is class run");
}
public static void show(){
System.out.println("this is class show");
}
}
4.2Test子类
public class Test extends Class{
static String static_v="static test";
String v_test="子类成员变量 test";
static {
System.out.println(static_v);
}
{
System.out.println(v_test+" 代码块");
}
int x=9;
public Test() {
super();
System.out.println("构造器:test");
}
public static void show(){
System.out.println("this is test show");
}
@Override
public void run() {
System.out.println("this is Test run");
}
public static void main(String[] args){
Class test=new Test();
System.out.println("-------初始化完成--------");
test.run();
test.show();
System.out.println(test.static_v);
}
}
4.3测试结果
static class
static test
父类成员变量 class 代码块
构造器:class
子类成员变量 test 代码块
构造器:test
-------初始化完成--------
this is Test run
this is class show
static class
5分析
从子类的初始化来看,是符合上面提出类初始流程的。子类初始化转成父类,分别调用静态方法,非静态重写方法,静态成员变量,可以看出符合JAVA继承的隐藏和覆盖规则。