能否够重写静态方法

1. 能否够重写静态方法

假设从重写方法会有什么特点来看,我们是不能重写静态方法的。尽管就算你重写静态方法,编译器也不会报错。也就是说,假设你试图重写静态方法,Java不会阻止你这么做,但你却得不到预期的结果(重写仅对非静态方法实用)。重写指的是依据执行时对象的类型来决定调用哪个方法,而不是依据编译时的类型。让我们猜一猜为什么静态方法是比較特殊的?由于它们是类的方法,所以它们在编译阶段就使用编译出来的类型进行绑定了。使用对象引用来訪问静态方法仅仅是Java设计者给程序猿的自由。我们应该直接使用类名来訪问静态方法,而不要使用对象引用来訪问。

让我们看一个样例,来看看重写静态方法会发生什么:

class SuperClass{
    ......
    public static void staticMethod(){
        System.out.println("SuperClass: inside staticMethod");
    }
    ......
}
public class SubClass extends SuperClass{
    ...... //overriding the static method
     public static void staticMethod(){
    System.out.println("SubClass: inside staticMethod");
     }
    ......
    public static void main(String []args){
        ......
        SuperClass superClassWithSuperCons = new SuperClass();
        SuperClass superClassWithSubCons = new SubClass();
        SubClass subClassWithSubCons = new SubClass();
        superClassWithSuperCons.staticMethod();
        superClassWithSubCons.staticMethod();
        subClassWithSubCons.staticMethod();
        ...
    }
} 

输出:

<pre name="code" class="java">SuperClass: inside staticMethod
SuperClass: inside staticMethod
SubClass: inside staticMethod

注意第二行输出。如果staticMethod方法被重写了,它的结果应该和第三行一样,也是调用执行时的类型SubClass的staticMethod(),而不是SuperClass的staticMethod()方法。这也就证明了静态方法是在编译阶段使用了编译类型信息,进行静态绑定的。

2.synchronizedkeyword是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自己主动是synchronized f(){},而是变成了f(){}。继承类须要你显式的指定它的某个方法为synchronized方法;

				
时间: 2024-11-05 11:28:55

能否够重写静态方法的相关文章

是否可以重写静态方法

1. 是否可以重写静态方法 如果从重写方法会有什么特点来看,我们是不能重写静态方法的.虽然就算你重写静态方法,编译器也不会报错.也就是说,如果你试图重写静态方法,Java不会阻止你这么做,但你却得不到预期的结果(重写仅对非静态方法有用).重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型.让我们猜一猜为什么静态方法是比较特殊的?因为它们是类的方法,所以它们在编译阶段就使用编译出来的类型进行绑定了.使用对象引用来访问静态方法只是Java设计者给程序员的自由.我们应该直接使用类

静态方法 java 继承

可以继承,例子: class A{ public static void a(){ System.out.println("a"); } } class B extends A{} public class Test { public static void main(String[] args) { B.a();//输出a,证明静态方法可以被继承 } } 不能被覆写,例子: class A{ public static void a(){ System.out.println(&qu

Swift 2.0学习笔记(Day 45)——重写方法

?? 原创文章,欢迎转载.转载请注明:关东升的博客 重写实例方法 在子类中重写从父类继承来的实例方法和静态方法.先介绍实例方法的重写. 下面看一个示例: class Person { var name: String var age: Int func description() -> String { //实例方法 return "\(name) 年龄是: \(age)" } class func printClass() ->() { //静态方法 print( &qu

Swift—重写-备

========================= 重写实例属性 我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的. 实例属性的重写一方面可以重写getter和setter访问器,另一方面可以重写属性观察者. 计算静态属性需要使用getter和setter访问器,而存储属性不需要.子类在继承父类后,也可以通过getter和setter访问器重写父类的存储属性和计算属性. 下面看一个示例: [html] view plain copy print? c

虚方法与两种重写方法的比较

虚方法virtual..override: 1.派生类的方法和基类的方法有相同的签名和返回类型. 2.基类的方法使用virtual标注. 3.派生类的方法使用override标注. class MyBaseClass { virtual pubilc void Print() ... } class MyDerivedClass : MyBaseClass { override pubilc void Print() ... } 注意: 1.重写和被重写的方法必须有相同的可访问性.换一种说法,被

java方法的重写与重载

方法重写规则: 参数列表和返回值类型必须与被重写的方法相同 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected 父类的成员方法只能被它的子类重写 声明为final的方法不能被重写 静态方法也能被继承. 但是, 静态方法不能被覆盖. 如果父类中 定义的静态方法在子类中被重新定义, 那么在父类中定义的静态方法将被隐藏. 可 以使用语法: 父类名 .静态方法名(SuperClassName. staticM

java 重写的 几大注意点

Single Dispatch class Parent { void print(String a) { log.info("Parent - String"); } void print(Object a) { log.info("Parent - Object"); } } class Child extends Parent { void print(String a) { log.info("Child - String"); } vo

重写(override)

override也叫做覆盖 子类方法名称必须与父类方法名称一致 参数列表一致 返回类型一致或父类方法返回类型的子类类型 修饰符不能缩小范围 构造方法不能重写 属性不能重写 静态方法不能重写 私有方法不能重写 原文地址:https://www.cnblogs.com/huochemeiyouhuo/p/12165816.html

java8接口默认方法静态方法和重复注解

接口默认方法和静态方法 默认方法 interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */