lzy05182930 2022-08-31 18:52 采纳率: 100%
浏览 48
已结题

Java静态方法可以被继承吗

Java静态方法可以被继承吗,如果可以,继承过来的静态方法有什么特别之处?

  • 写回答

3条回答 默认 最新

  • 叶孤崖 2022-08-31 18:58
    关注

    看以下代码:

    /**
     * 父类
     */
    class Father {
        public static String staticStr = "父类的静态变量";
        public String notStaticStr = "父类的成员变量(非静态变量)";
     
        public static void staticMethod() {
            System.out.println("父类的静态方法");
        }
     
        public void notStaticMethod() {
            System.out.println("父类的成员方法(非静态方法)");
        }
    }
     
    /**
     * 子类继承父类,改写静态变量和方法
     */
    class SonA extends Father {
        public static String staticStr = "子类改写后的静态变量";
        public String notStaticStr = "子类改写后的成员变量(非静态变量)";
     
        public static void staticMethod() {
            System.out.println("子类改写后的静态方法");
        }
     
        @Override
        public void notStaticMethod() {
            // 成员方法是可以被子类重写的,这里仅作说明
            System.out.println("子类改写后的成员方法(非静态方法)");
        }
    }
     
    /**
     * 子类继承父类中的所有属性和方法,但不修改
     */
    class SonB extends Father {
     
    }
    
    public class Demo {
        public static void main(String[] args) {
            // 子类SonB继承父类Father,子类可以获取父类的所有属性和方法,无论是静态的还是非静态的。
            // 表明静态属性和静态方法可以被继承
            SonB sonB = new SonB();
            System.out.println(sonB.staticStr);// 获取父类的静态变量
            System.out.println(sonB.notStaticStr);// 获取父类的成员变量(非静态变量)
            sonB.staticMethod();// 调用父类的静态方法
            sonB.notStaticMethod();// 调用父类的非静态方法(成员方法)
            System.out.println("=============================================");
     
            // 表明在使用多态的情况下,静态属性和静态方法又可以被继承
            Father sonBF = new SonB();
            System.out.println(sonBF.staticStr);// 多态获取父类的静态变量
            System.out.println(sonBF.notStaticStr);// 多态获取父类的成员变量(非静态变量)
            sonBF.staticMethod();// 多态调用父类的静态方法
            sonBF.notStaticMethod();// 多态调用父类的非静态方法(成员方法)
     
            System.out.println("=============================================");
            System.out.println("=============================================");
     
            // 子类SonA继承父类Father,并且重写了父类的属性和方法。
            // 表明父类的静态属性和静态方法可以被覆盖
            SonA sonA = new SonA();
            System.out.println(sonA.staticStr);// 获取子类重写后的静态变量
            System.out.println(sonA.notStaticStr);// 获取子类重写后的成员变量(非静态变量)
            sonA.staticMethod();// 调用子类重写后的静态方法
            sonA.notStaticMethod();// 调用子类重写后的非静态方法(成员方法)
     
            System.out.println("=============================================");
     
            // 表明父类的静态属性和静态方法可以被覆盖,但覆盖后就没有多态了
            Father sonAF = new SonA();
            System.out.println(sonAF.staticStr);// 多态获取子类重写后的静态变量
            System.out.println(sonAF.notStaticStr);// 多态获取子类重写后的成员变量(非静态变量)
            sonAF.staticMethod();// 多态调用子类重写后的静态方法
            sonAF.notStaticMethod();// 多态调用子类重写后的非静态方法(成员方法)
     
            Father.staticMethod();
            SonA.staticMethod();
        }
    }
     
    /*打印结果:
        父类的静态变量
        父类的成员变量(非静态变量)
        父类的静态方法
        父类的成员方法(非静态方法)
        =============================================
        父类的静态变量
        父类的成员变量(非静态变量)
        父类的静态方法
        父类的成员方法(非静态方法)
        =============================================
        =============================================
        子类改写后的静态变量
        子类改写后的成员变量(非静态变量)
        子类改写后的静态方法
        子类改写后的成员方法(非静态方法)
        =============================================
        父类的静态变量
        父类的成员变量(非静态变量)
        父类的静态方法
        子类改写后的成员方法(非静态方法)
        父类的静态方法
        子类改写后的静态方法
     */
    

    可以看到父类的静态方法和变量可以被覆盖,也允许在子类中定义同名的静态变量和静态方法,但没有多态。

    即“Java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏”。

    原因如下:

    • 静态方法和属性是属于类的,与类绑定在一起的,调用的时候直接通过类名,不需要继承机制就可以调用。如果子类里面定义了同名的静态方法和属性,那么这时候父类的静态方法和属性称之为“隐藏”,也就是上面第三段代码所表现出来的结果。如果要调用父类的静态方法和属性,直接通过父类名调用方法或属性即可完成。
    • 多态的实现是依赖于继承、接口和重写,有了继承和重写才可以实现父类的引用指向不同子类的对象。重写后子类的优先级要高于父类的优先级,但是隐藏没有这个优先级。
    • 静态属性和静态方法都可以被继承和隐藏而不能被重写,因此不能实现多态,也就不能使用父类的引用指向不同的子类对象。

    总结:

    1. 如果子类定义了与父类同名的静态属性和静态方法,那么在子类调用的一定是子类的静态属性和静态方法。

    2. 如果子类没有定义与父类同名的静态属性和静态方法,那么在子类调用的一定是父类的静态属性和静态方法。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月8日
  • 已采纳回答 8月31日
  • 创建了问题 8月31日

悬赏问题

  • ¥100 需求高精度PT100设计电路和算法
  • ¥15 单片机配网,继电器开关,广播
  • ¥60 Qcustomplot绘制实时动态曲线
  • ¥20 运用matlab画x-y图
  • ¥15 用idea运行项目,运行tomcat报错:断言失败
  • ¥15 Sqlserver查询链接服务器数据问题
  • ¥15 Bibtex4Word 引用中文文献
  • ¥20 用opencv c/c++ 转换成灰度图,然后做一下直方图均衡,输出mp4文件
  • ¥20 matlab中的双层数值积分
  • ¥50 服务器打印水晶报表问题