Java静态方法不能被覆盖

// 静态方法不能被覆盖

?

/*class Super{

????static String name(){

????????return "mother";

????}

}

?

class Test02{

????public static void main(String[] args){

????????Super s3 = new Super();

????????System.out.println(s3.name());

????}

}

*/

?

/*

* result:mother

*/

?

/*

class Super{

????static String name(){

????????return "mother";

????}

}

?

class Sub extends Super{

???? String name(){

????????return "baby";

????}

}

?

class Test02{

????public static void main(String[] args){

????????Super s1 = new Sub();

????????System.out.println(s1.name());????????

????}

}

*/

?

// result: mother

?

/*

class Super{

???? String name(){

????????return "mother";

????}

}

?

class Sub extends Super{

????static String name(){

????????return "baby";

????}

}

?

class Test02{

????public static void main(String[] args){

????????Super s1 = new Sub();

????????System.out.println(s1.name());????????

????}

}

*/

?

// result: mother

?

class Super{

????static String name(){

????????return
"mother";

????}

}

?

class Sub extends Super{

????static String name(){

????????return
"baby";

????}

}

?

class Test02{

????public
static
void main(String[] args){

????????Super s = new Super();

????????System.out.println(s.name());????????

????????Super s1 = new Sub();

????????/*运行时是指向Sub的类,s1.name()应该输出"baby"的。却输出mother了*/

????????System.out.println(s1.name());

????????/*

???????? * 结果是:mother

???????? * "静态方法在编译时根据调用该方法的类或对象所属的类决定

???????? * 实例方法在运行时根据对象所属的类决定"该如何理解?

???????? */

????}

}

?

时间: 2024-10-07 07:58:53

Java静态方法不能被覆盖的相关文章

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

java中重载、覆盖和隐藏三者的区别分析

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

java的重载、覆盖和隐藏的区别

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

java静态方法的重写,为什么不能?

JAVA静态方法形式上可以重写,但从本质上来说不是JAVA的重写.因为静态方法只与类相关,不与具体实现相关,声明的是什么类,则引用相应类的静态方法(本来静态无需声明,可以直接引用),看下例子: Java代码   class Base{ static void a( ){System.out.println("A");  } void b( ){System.out.println("B"); } } public class  Inherit extends Bas

Java继承方法隐藏(覆盖)

方法隐藏 一个类从其超类继承所有非私有静态方法.在子类中重新定义继承的静态方法称为方法隐藏.子类中的重定义静态方法隐藏其超类的静态方法.在类中重定义非静态方法称为方法覆盖.关于方法隐藏的重定义方法(名称,访问级别,返回类型和异常)的所有规则与方法覆盖相同. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class MySuper {   public static void print() {     System.

java静态方法(变量)、非静态方法(变量)区别

java静态方法.静态变量在调用时生成唯一标识,即在内存中给定一个静态位子,这样在调用时可以直接找到,而且会节省内存.但如果声明的静态方法.静态变量过多,会占用过多内存,有可能导致内存溢出. 非静态方法.非静态变量有gc管理,每new一个对象时,在堆上分配一块内存,不用时由gc回收. 即,静态方法.静态变量预先分配,非静态方法.非静态变量动态分配. 所有的class.static变量位于方法区,方法区既可以在堆上,又可以在栈上.

Java之重载与覆盖

有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println()能够打印出任何数据类型的数据,它有多种实现方式.运行时,Java虚拟机先判断给定参数的类型,然后决定执行哪个println()方法(int char String等). 重载(overload):对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系.这里有两个问题需要注意: (1)       什么叫参数列表?参数列表

Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

方法覆盖也称为重写,重写即子类重新定义了父类的方法. 重写: 1.重写的方法必须与原方法有相同的方法名.参数列表和返回值类型(Java SE5之后返回值类型可以是其类型的子类型) 2.被重写的方法不能是final类型,因为final类型无法重写 3.被重写的方法不能是private,因为private无法继承,而继承是重写的前提 4.被重写的方法不能为static, 如果父类中的方法为静态,而子类的方法不是静态的,但是两个方法除了这一点其他都满足重写条件,那么会发生编译错误,         

java 静态方法和实例方法的区别

静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象.   静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制.   下面几个例子展示了这一区别.   1.调用静态方法示例. //-----------hasStaticMethod.j