java 子类继承父类 -- 重写、覆盖与多态

本文详细解读Java中类的继承与多态特性,包括实例方法覆盖与静态方法隐藏的区别,以及如何通过super关键字访问隐藏的实例变量。通过具体代码示例,展示了子类如何重写父类方法及成员变量的隐藏与覆盖现象。

1:

JAVA-傻子(373481014) 15:12:26 
1.同名的实例方法被覆盖 ,同名的静态方法被隐藏,child类的getName实例方法覆盖了parent的getName实例方法,chind的getKind方法隐藏了parent类的getKind方法
2.隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法
3.如果需要访问父类被隐藏 的实例变量,加上super就好了,比如访问父类的name,写上super.name就好了

JAVA-武汉学生(47013027) 15:15:02 

JAVA-武汉学生(47013027) 15:15:20 

JAVA-武汉学生(47013027) 15:15:34 
既然没有错误?这是为什么
JAVA-武汉学生(47013027) 15:16:46 
父类和子类里面都有自己的public的成员变量geshi
For_Funs(877083316) 15:17:29 
成员变量在子类中会被隐藏
JAVA-武汉学生(47013027) 15:17:50 

JAVA-傻子(373481014) 15:18:17 
1.不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法
2.不能用子类的实例方法覆盖 父类中同样标示的静态方法
3.这点儿请注意,就是变量只会被隐藏 不会被覆盖,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏父类的实例变量,子类的实例变量可以隐藏 父类的静态变量

 

2:

2009-09-14 walsh (资深程序员)
Java代码    收藏代码
  1. class Foo {  
  2.     public int a;  
  3.   
  4.     public Foo() {  
  5.         a = 3;  
  6.     }  
  7.   
  8.     public int addFive() {  
  9.         a += 5;  
  10.         return a;  
  11.     }  
  12.   
  13.     public int getA() {  
  14.         return a;  
  15.     }  
  16. }  
  17.   
  18. public class Bar extends Foo {  
  19.     public int a;  
  20.   
  21.     public Bar() {  
  22.         a = 8;  
  23.     }  
  24.   
  25.     public int addFive() {  
  26.         this.a += 5;  
  27.         return a;  
  28.     }  
  29.   
  30.     public int getA() {  
  31.         return a;  
  32.     }  
  33.   
  34.     public static void main(String[] args) {  
  35.         Foo foo = new Bar();  
  36.         //调用的是子类中的方法  
  37.         System.out.println(foo.getA());  
  38.         //直接调用父类中的a  
  39.         System.out.println("Value: " + foo.a);  
  40.         //调用的是子类中的方法  
  41.         System.out.println(foo.addFive());  
  42.           
  43.     }  
  44. }  
输出结果:  
8  
Value: 3  
13  


楼主,只需要明白一点就行了:在Java中重写指的是方法的重写,而不是属性的重写,还有多态也只是方法的多态 ,没有属性的多态。

 

<think>嗯,用户问子类继承父类为什么重写,这个问题看起来是关于面向对象编程的。首先,我得回忆一下面向对象的基本概念,尤其是继承多态这部分。子类继承父类是为了复用代码,但为什么重写呢? 可能用户在学习Java或者Python之类的语言时遇到了这个问题。他们可能已经知道继承的概念,但不太明白为什么重写父类的方法。也许他们在实际编码中遇到需要修改父类方法的情况,但不确定这样做的好处或者必要性。 首先,我需要考虑重写的目的。比如,父类的方法可能提供默认实现,但子类有特殊需求,这时候就需要重写。例如,动物类有“叫”的方法,狗类继承重写为“汪汪”,猫类重写为“喵喵”。这样不同的子类可以有不同的行为,这就是多态的体现。 然后,用户可能想知道重写的好处,比如增加灵活性和扩展性。如果所有子类都使用父类的方法,可能无法满足具体需求。重写允许子类自定义行为,而无需修改父类,符合开闭原则。 另外,可能用户对抽象类或接口的方法重写不太清楚。比如,父类中的抽象方法必须由子类实现,否则会报错。这时候重写是强制的,用户可能需要了解这种情况的存在。 还有,可能用户遇到需要增强或扩展父类方法功能的情况。例如,子类可以在调用父类方法的基础上添加新功能,使用super关键字先执行父类的方法,再执行子类的代码。这种情况下,重写是为了扩展而非完全替换。 另外,可能用户的问题背后是想了解如何设计可维护的代码结构。通过重写子类可以保持接口一致,但内部实现不同,这样在替换子类时不需要修改调用方的代码,提高了系统的可维护性。 不过,用户可能存在的疑问是:是否所有父类的方法都需要重写?显然不是,只有需要改变行为时才重写。这可能也是用户潜在的问题,需要进一步解释什么时候应该重写,什么时候不需要。 总结一下,回答应该包括以下几个点:实现多态、满足子类特定需求、增强或扩展功能、强制实现抽象方法、提高代码复用和扩展性。同时,可能需要举例说明,让用户更容易理解。 需要注意的是,用户可能刚接触这个概念,所以需要用简单的例子和通俗的语言,避免过多的术语。同时,可能需要区分重写(override)和重载(overload)的不同,但用户的问题明确是关于重写的,所以可能不需要展开讲重载,除非有混淆的可能。 最后,确保回答结构清晰,分点说明,这样用户能一步步理解原因和场景。可能还需要提到设计模式中的一些原则,比如开闭原则,来加强解释的深度,但不宜过于复杂。</think>子类继承父类后选择**重写(Override)**父类方法,主要是为了实现**多态性**和**定制化功能**。以下是几个关键原因: --- ### 1. **实现多态性** - **多态**是面向对象的核心特性,允许子类以不同的方式实现父类的方法。 - **示例**: ```java class Animal { void speak() { System.out.println("动物发出声音"); } } class Dog extends Animal { @Override void speak() { System.out.println("汪汪!"); } // 重写以实现具体行为 } ``` - 当调用 `Dog` 的 `speak()` 时,会执行子类的方法,而非父类默认实现。这使得同一方法在不同子类中有不同表现。 -- ### 2. **满足子类特殊需求** - 父类的方法可能是通用实现,但子类可能需要**更具体的行为**。 - **示例**: ```python class Payment: def pay(self): print("默认支付方式") class Alipay(Payment): def pay(self): # 重写以支持支付宝支付 print("使用支付宝支付") ``` --- ### 3. **增强或扩展父类功能** - 子类可以通过 `super()` 调用父类方法,并在其基础上**添加新逻辑**。 - **示例**: ```java class Logger { void log(String message) { System.out.println("记录日志: " + message); } } class TimestampLogger extends Logger { @Override void log(String message) { super.log(message); // 先调用父类方法 System.out.println("添加时间戳: " + System.currentTimeMillis()); } } ``` --- ### 4. **强制子类实现抽象方法** - 如果父类是**抽象类**或**接口**,子类**必须重写抽象方法**,否则会编译错误。 - **示例**: ```java abstract class Shape { abstract double area(); // 抽象方法,子类必须实现 } class Circle extends Shape { @Override double area() { return Math.PI * radius * radius; } // 必须重写 } ``` --- ### 5. **遵循开闭原则** - 通过重写子类可以修改行为而**无需改动父类代码**,符合“对扩展开放,对修改关闭”的设计原则。 -- ### 何时不需要重写- 如果父类的方法已满足子类需求,无需重写- 例如:`Bird` 类继承 `Animal` 的 `breathe()` 方法,若呼吸逻辑通用,则无需修改。 --- ### 总结 重写的核心目的是让子类**定制化行为**,同时保持接口一致性。它是实现多态、提高代码灵活性和扩展性的重要手段。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值