博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于方法覆盖和属性覆盖的问题?
阅读量:4187 次
发布时间:2019-05-26

本文共 2071 字,大约阅读时间需要 6 分钟。

class A{	public static String staticStr = "A's static field";	public String nonStaticStr = "A's nonstatic field";	public static void staticMethod()	{		System.out.println("A's static method");	}	public void nonStaticMethod()	{		System.out.println("A's nonstatic method");	}}class B extends A{	public static String staticStr = "B's static field";	public String nonStaticStr = "B's nonstatic field";	public static void staticMethod()	{		System.out.println("B's static method");	}	public void nonStaticMethod()	{		System.out.println("B's nonstatic method");	}}class C extends A{}public class Test{	public static void main(String[] args)	{		C c = new C();		System.out.println(c.nonStaticStr); // A's nonstatic field		System.out.println(c.staticStr); // A's static field		c.staticMethod(); // A's static method		c.nonStaticMethod(); // A's nonstatic method		System.out.println("-------------------------------");		A c1 = new C();		System.out.println(c1.nonStaticStr); // A's nonstatic field		System.out.println(c1.staticStr); // A's static field		c1.staticMethod(); // A's static method		c1.nonStaticMethod(); // A's nonstatic method		// 以上这说明java中静态属性和静态方法可以被继承		System.out.println("-------------------------------");		B b = new B();		System.out.println(b.nonStaticStr); // B's nonstatic field		System.out.println(b.staticStr); // B's static field		b.staticMethod(); // B's static method		System.out.println("-------------------------------");		A b1 = new B();		System.out.println(b1.nonStaticStr); // A's nonstatic field		System.out.println(b1.staticStr); // A's static field		b1.staticMethod(); // A's static method		b1.nonStaticMethod(); // B's nonstatic method	}}

结论是:

静态属性和静态方法只是可以继承没有表现出多态性。因为静态方法和静态属性没有采用动态绑定。

具体表现就是,将子类实例向上转型则会调用到基类中的静态方法和属性,不转型就调用子类自身的静态方法和属性。

编译器不推荐通过实例去调用静态方法和属性,因为这种调用方式容易造成混淆。实际上,在Java的规范中,Java

对于类的方法和属性采用了两种完全不同的处理机制:对于方法,使用重载机制实现了多态性;对于属性,使用的是

同名属性隐藏机制。所谓的同名属性隐藏机制是指:在具有父子关系的两个类中,子类中相同名字的属性会使得从

父类中继承过来的同名属性变得不可见,不管类型是否一致,名称一致的两个属性就是同名属性。在子类中,无法

简单地通过属性名称来获取父类中的属性, 而是必须通过父类名称加属性名称(super.变量名)的方法才可以访问

父类中的该属性。一般而言,为了代码容易阅读,极其不建议在父类和子类中使用同名属性。

转载地址:http://mypoi.baihongyu.com/

你可能感兴趣的文章
ARP 缓存污染和IFRAME嵌入攻击
查看>>
再谈:Norton误报WinXP事件的技术分析 二
查看>>
让我们摒弃一些浮躁 -- 对Norton误报WinXP事件的技术分析
查看>>
中间人攻击,也谈Firefox/Google Toolbar最新的安全漏洞
查看>>
MOICE, 微软发布的OFFICE最新安全功能
查看>>
对反病毒产品你应该知道的几个事实
查看>>
安全是谁的责任?应用程序还是操作系统? 再谈Google输入法的安全漏洞
查看>>
软件安全开发周期 - SDL
查看>>
续:Windows Vista操作系统最新安全特性分析:改进和局限 (下)
查看>>
Windows Vista操作系统最新安全特性分析:改进和局限 (上)
查看>>
微软DNS远程过程调用安全漏洞
查看>>
谷歌拼音输入法的安全漏洞
查看>>
动态光标(ANI)安全漏洞 -- 微软紧急安全公告
查看>>
互联网安全分析:Botnet,北京,中国,美国
查看>>
2006年计算机安全发展最新趋势 – 发表于2007年程序员1期
查看>>
Windows Vista 安全指南
查看>>
《自适应软件开发》—从奴隶主到领袖
查看>>
《自适应软件开发》—从奴隶主到领袖
查看>>
《自适应软件开发》—从奴隶主到领袖
查看>>
《自适应软件开发》—从奴隶主到领袖
查看>>