有关java中覆盖和隐藏的问题
发布网友
发布时间:2022-04-22 11:28
我来回答
共3个回答
热心网友
时间:2023-07-25 19:09
所谓父类静态方法在子类重新定义会被隐藏,指的实际上应该是静态方法,在子类中既不能被重写,也不能被重载。
所谓静态方法被隐藏应该类似于重写的作用,因为重写也是类似于隐藏了父类的那个方法。
实际上静态方法一般不存在被隐藏的问题,因为如果两个类有继承关系,并且两个类都有各自的一个静态方法(名称相同,参数,返回都相同),那么如果这时候从外部调用这两个类的静态方法,因为需要加上类名,所以不会重复,比如
class A{static void meth1(){}} class B extends A{static void meth1(){}}
class C
{
public static void main(String[] args)
{
A.meth1();
B.meth1();//从外部调用静态方法不存在隐藏。
}
}
如果从内部调用,那么就存在隐藏了,实际上就是和重写差不多吧。
class A{static void meth1(){}}
class B extends A
{
static void meth1(){}
public static void main(String[] args)
{
meth1(); //这里调用的是哪一个呢? 调用的是自身的,父类的被隐藏了。
}
}
下面来说下重写和重载
所谓重写和重载的最大的区别是:方法参数是否能改变。
例如重写:
class A
{
void Meth1(int i){}
}
class B extends A
{
void Meth1(int i){}
}
这就是重写,方法所接收的参数并没有改变。而当我创建一个对象去调用这个方法时,根据对象的不同,调用的方法将不同。例:
class C
{
public static void main(String[] args)
{
B x11=new B(); //创建一个b的对象
x11.Meth1(); //这时候调用的实际上就是B类的meth1,父类的meth1被
//隐藏了。
A x12=new A();
x12.Meth1(); //这时候调用的methe1就是A的methe1了
}
}
而改变方法参数的就是重载。例
class A
{
void Meth1(int i){}
}
class B
{
void Meth1(float j){}
}
这时候就是重载,可以看到,方法所需要的参数改变了。而这个时候,创建对象,调用者两个方法,一是看对象是哪个类的对象,二是看调用时候传递的参数是什么来决定具体的调用哪个方法。
class C
{
public static void main(String[] args)
{
A x11=new A();
x11.Meth1(); //A的对象当然只能调用A里面的meth1了
B x12=new B();
B.Meth1(1); //传递的是int,就调用int的那个
B.Meth1(1.1); // 传递的是float,就调用float的那个
}
}
热心网友
时间:2023-07-25 19:10
覆盖的意思就是如果你在子类中“覆盖”了父类的方法,那么你在生成对象的时候,如果你生成的是父类对象,那么方法还是调用父类没有被“覆盖”方法,如果是生成的子类对象,那么方法就调用被“覆盖”过的方法。
所谓隐藏,就是无论你生成父类对象还是子类对象,只要你子类对象重新定义了父类的静态方法,那么调用的都是子类中被重新定义的方法,而父类的方法无法被调用。
所以隐藏是只父类的方法被隐藏,无法被调用;而覆盖是指子类的方法覆盖父类的方法,但是父类还是可以调用自己的方法。
原因是,静态方法是描述一个类的行为的方法,就算没有对象也可以被调用,所以无论你创建什么对象(子类或者父类)都是一样的,但是如果是覆盖非静态方法的话,那就跟对象有关了,创建什么对象就调用谁的方法。
热心网友
时间:2023-07-25 19:10
class A{
static void fun1(){
System.out.println("A.fun1()");
}
static void fun3(){
System.out.println("A.fun3()");
}
}
class B extends A{
static void fun1(){
System.out.println("B.fun1()");
}
static void fun2(){
System.out.println("B.fun2()");
}
public void getAFun1(){
super.fun1();
}
}
class Test{
static public void main(String[] str){
B b=new B();
b.fun1();
b.fun2();
b.fun3();
b.getAFun1();
}
}