java基础问题,java 方法为什么要覆写,在子类中重新写个方法不就好了吗

时间:2020-12-12 20:06:19

java基础问题,java 方法为什么要覆写,在子类中重新写个方法不就好了吗

在实际应用时,什么地方用得着

12 个解决方案

#1


覆写是什么意思?我只听过重载和重写啊

#2


LZ你把继承弄清楚了那你就能理解为什么要重写了

#3



package test.resources;

public class A {
String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public void print() {
System.out.println("Class A:" + code);
}
}

package test.resources;

public class B extends A {
String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public void print() {
// super.print();
System.out.println("Class B:" + code);
}

}


package test.resources;
import org.junit.Test;


public class T {
@Test
public void test(){
A a = new B();
a.setCode("abcd");
a.print();
}
}

#4


不说别的。。如果没覆写,光你想方法名就够你受了。。

#5


IOC反向控制,你去了解一下嘛。

#6


三楼,你好: 代码我能看懂,我的意思是:
      父类的对像实例化子类,然后调用 print 覆盖 父类的 print 
      我的意思是子类不要用print 这个方法名(比方print1),然后 用子类对像实例化本类 B b= new B() ;b.print1();
不就完事了吗? 
      我是不明白JAVA 为什么要搞个覆盖方法...有什么好处吗?我不能理解

#7


写程序有个原则 叫 开闭原则 大概意思是 对修改关闭 对 增加开放   比如有个 动物类(Animal) 这个动物类有 说(say) 这个方法  
有如下代码要调用这个方法   
public void show(Animal animal){
     animal.say();
}
如果你 有个 狗类(Dog) 传进去   他调用的是狗类 特有狗说(汪) 的方法 
如果你 有个 狗类(Dog) 传进去   他调用的是猫类 特有猫说(喵) 的方法 
如果你 传个 人类(你自己) 进去  他就在这里 就有他 人特有 说 (提问) 的方法
而上面的代码几乎不用改变  
不知道你明不明白

#8


引用 6 楼 blotusland 的回复:
三楼,你好:   代码我能看懂,我的意思是:
            父类的对像实例化子类,然后调用   print   覆盖   父类的   print  
            我的意思是子类不要用print   这个方法名(比方print1),然后   用子类对像实例化本类   B   b=   new   B()   ;b.print1();
不就完事了吗?  
        ……


抛开 任何 思想上东西不说

你在  B 里 顶一个  print1 方法 
 A a = new B();  创建的对象a    你能调用到   print1 嘛

#9


引用 6 楼 blotusland 的回复:
三楼,你好:   代码我能看懂,我的意思是:
            父类的对像实例化子类,然后调用   print   覆盖   父类的   print  
            我的意思是子类不要用print   这个方法名(比方print1),然后   用子类对像实例化本类   B   b=   new   B()   ;b.print1();
不就完事了吗?  
        ……

A a=new B();//他创建的是上转型对象,它所使用的变量是继承和覆盖掉的,方法是继承和重写的方法
而B b=new  B() //它创建的是一般对象b.print1();调用的是子类中的方法

#10


动态绑定在C++和Java中都是一样的,这样可以使接口保持最大的适用性,
接楼上的,比如说有两种动物Dog,Cat类,都继承Animal类,都有叫的动作,定义一个接口函数为animalSound(Animal instance)。当形参为Dog时,instance.cry();为Dog的Cry方法,为Cat时则为Cat的Cry方法,同一个接口不用写两个函数,并且当有新的类Bird等加入时,接口函数也不用改变。

#11


因为我们需要统一的“接口”,如果每种子类型都完全抛弃父类的方法,另起炉灶,那面向接口的编程就不复存在了。保证方法签名一致就是保证语义的一致,但是实现细节可以变化。

#12


在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

#1


覆写是什么意思?我只听过重载和重写啊

#2


LZ你把继承弄清楚了那你就能理解为什么要重写了

#3



package test.resources;

public class A {
String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public void print() {
System.out.println("Class A:" + code);
}
}

package test.resources;

public class B extends A {
String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public void print() {
// super.print();
System.out.println("Class B:" + code);
}

}


package test.resources;
import org.junit.Test;


public class T {
@Test
public void test(){
A a = new B();
a.setCode("abcd");
a.print();
}
}

#4


不说别的。。如果没覆写,光你想方法名就够你受了。。

#5


IOC反向控制,你去了解一下嘛。

#6


三楼,你好: 代码我能看懂,我的意思是:
      父类的对像实例化子类,然后调用 print 覆盖 父类的 print 
      我的意思是子类不要用print 这个方法名(比方print1),然后 用子类对像实例化本类 B b= new B() ;b.print1();
不就完事了吗? 
      我是不明白JAVA 为什么要搞个覆盖方法...有什么好处吗?我不能理解

#7


写程序有个原则 叫 开闭原则 大概意思是 对修改关闭 对 增加开放   比如有个 动物类(Animal) 这个动物类有 说(say) 这个方法  
有如下代码要调用这个方法   
public void show(Animal animal){
     animal.say();
}
如果你 有个 狗类(Dog) 传进去   他调用的是狗类 特有狗说(汪) 的方法 
如果你 有个 狗类(Dog) 传进去   他调用的是猫类 特有猫说(喵) 的方法 
如果你 传个 人类(你自己) 进去  他就在这里 就有他 人特有 说 (提问) 的方法
而上面的代码几乎不用改变  
不知道你明不明白

#8


引用 6 楼 blotusland 的回复:
三楼,你好:   代码我能看懂,我的意思是:
            父类的对像实例化子类,然后调用   print   覆盖   父类的   print  
            我的意思是子类不要用print   这个方法名(比方print1),然后   用子类对像实例化本类   B   b=   new   B()   ;b.print1();
不就完事了吗?  
        ……


抛开 任何 思想上东西不说

你在  B 里 顶一个  print1 方法 
 A a = new B();  创建的对象a    你能调用到   print1 嘛

#9


引用 6 楼 blotusland 的回复:
三楼,你好:   代码我能看懂,我的意思是:
            父类的对像实例化子类,然后调用   print   覆盖   父类的   print  
            我的意思是子类不要用print   这个方法名(比方print1),然后   用子类对像实例化本类   B   b=   new   B()   ;b.print1();
不就完事了吗?  
        ……

A a=new B();//他创建的是上转型对象,它所使用的变量是继承和覆盖掉的,方法是继承和重写的方法
而B b=new  B() //它创建的是一般对象b.print1();调用的是子类中的方法

#10


动态绑定在C++和Java中都是一样的,这样可以使接口保持最大的适用性,
接楼上的,比如说有两种动物Dog,Cat类,都继承Animal类,都有叫的动作,定义一个接口函数为animalSound(Animal instance)。当形参为Dog时,instance.cry();为Dog的Cry方法,为Cat时则为Cat的Cry方法,同一个接口不用写两个函数,并且当有新的类Bird等加入时,接口函数也不用改变。

#11


因为我们需要统一的“接口”,如果每种子类型都完全抛弃父类的方法,另起炉灶,那面向接口的编程就不复存在了。保证方法签名一致就是保证语义的一致,但是实现细节可以变化。

#12


在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。