之前,关于多态这一块一直感觉很模糊,今天有空,自己专门测试了一下。
要操作的Bean类
//非静态变量
class A{
int a = 1;
}
class B extends A{
int a = 3;
int b = 2;
}
//静态变量
class AA{
static int a = 1;
}
class BB extends AA{
static int a = 2;
}
class CC extends AA{
static int a = 3;
}
class M1{
static void show(){
System.out.println("M1.show()");
}
}
class M2 extends M1{
static void show(){
System.out.println("M2.show()");
}
}
public class Bean {
}
***********************************************************************************************************************************************
测试类
import org.junit.Test;
public class Test1 {
//非静态变量是可以被继承的(int a)
@Test
public void test1(){
A a = new A();
System.out.println(a.a);//1
B b = new B();
System.out.println(b.a);//1
System.out.println(b.b);//2
}
//非静态变量在编译时就被确定了,不能被重写。事实上重写是对于方法来讲的
@Test
public void test2(){
B b = new B();
System.out.println(b.a);//3
System.out.println(b.b);//2
A ab = new B();
System.out.println(ab.a);//1
//b cannot be resolved or is not a field
//System.out.println(ab.b);//1
}
//静态变量是可以被继承的
@Test
public void test3(){
AA aa = new AA();
System.out.println(aa.a);//1
System.out.println(AA.a);//1
//BB中不声明同类型同名的变量
BB bb = new BB();
/*System.out.println(bb.a);//1
System.out.println(BB.a);//1
*/
//如果给子类BB声明一个同类型同名非静态变量 int a = 2;
/*System.out.println(bb.a);//2
System.out.println(BB.a);//编译报错
*/
//如果给子类BB声明一个同类型同名静态变量 static int a = 2;
System.out.println(bb.a);//2
System.out.println(BB.a);//2
}
//静态变量也不能被重写
@Test
public void test4(){
AA ac = new CC();
//CC中不声明同类型同名的变量
//System.out.println(ac.a);//1
//如果给子类CC声明一个同类型同名非静态变量 int a = 2;
System.out.println(ac.a);//1
//如果给子类BB声明一个同类型同名静态变量 static int a = 2;
System.out.println(ac.a);//1
}
//静态方法可以被继承
@Test
public void test5(){
M2 m2 = new M2();
m2.show();//M1.show()
M2.show();//M1.show()
}
//静态方法不能被重写
@Test
public void test6(){
M1.show();//M1.show()
M2.show();//M2.show()
//如果在子类M2声明一个同名同参数的静态方法 static void show(),此时父类的静态方法被隐藏
M2 m2 = new M2();
m2.show();//M2.show()
//向上转型(多态) 父类静态方法没有被重写
M1 m12 = new M2();
m12.show();//M1.show(),说明父类静态方法没有被重写
}
}
结论:变量(静态和非静态)可以被继承,但不会被重写(对变量说重写不专业,但就这么理解着吧)。 非静态方法可以被继承,也可以被重写; 静态方法可以被继承,不能被重写。
来源:https://blog.csdn.net/weixin_37476718/article/details/99710156