• 父子类中静态方法和属性实现



    牛客网的评论中的,感觉总结的挺好的。

     1 public class A {
     2     public static String staticStr = "A's static field"; 
     3     public String nonStaticStr = "A's nonstatic field"; 
     4     public static void staticMethod(){ 
     5         System.out.println("A's static method"); 
     6     } 
     7     public void nonStaticMethod(){ 
     8         System.out.println("A's nonstatic method"); 
     9     } 
    10 } 
    11 public class B extends A{
    12     public static String staticStr = "B's static field"; 
    13     public String nonStaticStr = "B's nonstatic field"; 
    14     public static void staticMethod(){ 
    15         System.out.println("B's static method"); 
    16     } 
    17 }
    18 public class C extends A{
    19    
    20 }
    21 public class Test {   
    22     public static void main(String[] args) { 
    23         C c = new C(); 
    24         System.out.println(c.nonStaticStr);  //A's nonstatic field
    25         System.out.println(c.staticStr);  //A's static field
    26         c.staticMethod(); //A's static method
    27         
    28         System.out.println("-------------------------------"); 
    29            
    30         A c1 = new C(); 
    31         System.out.println(c1.nonStaticStr);  //A's nonstatic field
    32         System.out.println(c1.staticStr);  //A's static field
    33         c1.staticMethod(); //A's static method
    34           
    35         // 以上这说明java中静态属性和静态方法可以被继承
    36          
    37         System.out.println("-------------------------------"); 
    38         B b = new B(); 
    39         System.out.println(b.nonStaticStr); // B's nonstatic field
    40         System.out.println(b.staticStr);   //B's static field
    41         b.staticMethod();  //B's static method
    42          
    43         System.out.println("-------------------------------"); 
    44         A b1 = new B(); 
    45         System.out.println(b1.nonStaticStr);  //A's nonstatic field
    46         System.out.println(b1.staticStr);  //A's static field
    47         b1.staticMethod(); //A's static method
    48         //b1.nonStaticStr  输出的是父类的非静态属性,说明非静态属性不可以被重写,不能实现多态
    49         //b1.staticStr     输出的是父类的静态属性,说明静态属性不可以被重写,不能实现多态
    50         //b1.staticMethod()输出的是父类A的静态方法,不是子类B改写后的,所以没有实现多态
    51          
    52          
    53         //结论是:静态属性和静态方法只是可以继承没有表现出多态性。
    54         //因为静态方法和静态属性没有采用动态绑定。具体表现就是,
    55         //将子类实例向上转型则会调用到基类中的静态方法和属性,
    56         //不转型就调用子类自身的静态方法和属性。
    57         //编译器不推荐通过实例去调用静态方法和属性,因为这种调用方式容易造成混淆。
    58          
    59         //实际上,在Java的规范中,Java对于类的方法和属性采用了两种完全不同的处理机制:
    60         //对于方法,使用重载机制实现了多态性;对于属性,使用的是同名属性隐藏机制。
    61         //所谓的同名属性隐藏机制是指:在具有父子关系的两个类中,
    62         //子类中相同名字的属性会使得从父类中继承过来的同名属性变得不可见,
    63         //不管类型是否一致,名称一致的两个属性就是同名属性。
    64         //在子类中,无法简单地通过属性名称来获取父类中的属性,
    65         //而是必须通过父类名称加属性名称(super.变量名)的方法才可以访问父类中的该属性。
    66         //一般而言,为了代码容易阅读,极其不建议在父类和子类中使用同名属性。
    67     } 
    68    
    69 }
  • 相关阅读:
    jar命令|jdt的简单使用
    国际化程序实现
    泛型接口
    RunTime类
    权限控制
    日期操作类
    异常
    Visual C# 2008+SQL Server 2005 数据库与网络开发―― 3.2 C# 2008多语言的新特性
    Visual C# 2008+SQL Server 2005 数据库与网络开发―― 2.6 创建项目
    Visual C# 2008+SQL Server 2005 数据库与网络开发――3.1.3 C# 2008和.NET Framework 3.5的关系
  • 原文地址:https://www.cnblogs.com/sjxbg/p/8891997.html
Copyright © 2020-2023  润新知