继承性,多态性,静态方法与变量的测试

可紊 提交于 2019-11-27 19:27:42

 

之前,关于多态这一块一直感觉很模糊,今天有空,自己专门测试了一下。

要操作的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(),说明父类静态方法没有被重写

	}
}

结论:变量(静态和非静态)可以被继承,但不会被重写(对变量说重写不专业,但就这么理解着吧)。        非静态方法可以被继承,也可以被重写;  静态方法可以被继承,不能被重写。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!