前言
继承是面向对象编程中的一项基本概念,它允许一个类(子类或派生类)使用另一个类(父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以在不改变父类的情况下添加新的属性和方法,或者修改父类的行为。
在继承关系中,父类通常包含一些通用的属性和方法,而子类则通过继承这些特性来获得共享的行为。这有助于提高代码的可重用性、可扩展性和组织性。
在Java中,使用extends关键字实现继承,子类通过继承可以获得父类的非私有成员变量和方法,子类的构造方法可以调用父类的构造方法,使用super()关键字。
子类的继承性
子类和父类在同一个包中的继承性
如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。
例子
代码
java
// 在同一包中的父类
class Animal {
public String publicField = "公共字段";
protected String protectedField = "受保护字段";
String defaultField = "默认字段";
private String privateField = "私有字段";
public void publicMethod() {
System.out.println("公共方法");
}
protected void protectedMethod() {
System.out.println("受保护方法");
}
void defaultMethod() {
System.out.println("默认方法");
}
private void privateMethod() {
System.out.println("私有方法");
}
}
// 在同一包中的子类
class Dog extends Animal {
// 子类自然地继承了父类的成员变量
void accessFields() {
System.out.println(publicField); // 可以访问父类的公共字段
System.out.println(protectedField); // 可以访问父类的受保护字段
System.out.println(defaultField); // 可以访问父类的默认字段
// System.out.println(privateField); // 无法访问父类的私有字段
}
// 子类自然地继承了父类的方法
void accessMethods() {
publicMethod(); // 可以调用父类的公共方法
protectedMethod(); // 可以调用父类的受保护方法
defaultMethod(); // 可以调用父类的默认方法
// privateMethod(); // 无法调用父类的私有方法
}
}
public class Test {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.accessFields(); // 调用子类方法,访问继承的成员变量
myDog.accessMethods(); // 调用子类方法,访问继承的方法
}
}
运行结果
子类和父类不在一个包中的继承性
如果子类和父类不在同一个包中,那么子类继承了父类的protected,public成员变量作为子类的成员变量,并且继承了父类的protected,public方法作为子类的方法,继承的成员或方法的访问权限保持不变。如果子类和父类不在同一个包中,子类不能继承父类的友好变量和友好方法。
友好变量通常指的是没有明确的访问修饰符(public、private、protected、default)的成员变量
友好方法通常指的是没有明确的访问修饰符(public、private、protected、default)的方法。
例子
代码
Animal.java
java
package Animal;
// 在不同包中的父类
public class Animal {
public String publicField = "公共字段";
protected String protectedField = "受保护字段";
String defaultField = "默认字段"; // 包私有字段,子类无法继承
private String privateField = "私有字段"; // 私有字段,子类无法继承
public void publicMethod() {
System.out.println("公共方法");
}
protected void protectedMethod() {
System.out.println("受保护方法");
}
void defaultMethod() {
System.out.println("默认方法"); // 包私有方法,子类无法继承
}
private void privateMethod() {
System.out.println("私有方法"); // 私有方法,子类无法继承
}
}
Main.java
java
package Main;
import Animal.Animal;
class Dog extends Animal {
// 子类继承了父类的protected和public成员变量
void accessFields() {
System.out.println(publicField); // 可以访问父类的公共字段
System.out.println(protectedField); // 可以访问父类的受保护字段
// System.out.println(defaultField); // 无法继承父类的包私有字段
// System.out.println(privateField); // 无法继承父类的私有字段
}
// 子类继承了父类的protected和public方法
void accessMethods() {
publicMethod(); // 可以调用父类的公共方法
protectedMethod(); // 可以调用父类的受保护方法
// defaultMethod(); // 无法继承父类的包私有方法
// privateMethod(); // 无法继承父类的私有方法
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.accessFields(); // 调用子类方法,访问继承的成员变量
myDog.accessMethods(); // 调用子类方法,访问继承的方法
}
}
运行结果
总结
继承在Java中是一种关键的面向对象编程机制,通过使用extends关键字,子类能够继承父类的属性和方法。在继承中,子类可以访问父类的public和protected成员,但不能访问private成员。通过方法的重写,子类可以提供特定于自身的实现。此外,继承是实现多态性的基础,允许父类引用指向子类对象。通过学习继承,我不仅理解了如何有效地组织和重用代码,还能够更灵活地运用多态性,提高代码的可扩展性和可维护性。
通过掌握Java继承,我在编码中实现了更高水平的代码重用,改善了代码的可读性和可维护性。能够设计合理的类层次结构,使我的代码更有组织性和可扩展性。继承的理解帮助我更好地应用多态性,提高了代码的灵活性。此外,通过深入学习继承的概念,我更容易理解和使用各种框架,同时能够更好地运用设计模式,提高了面向对象思维的水平。综合而言,通过学习Java继承,我的编程能力得到了有力的提升,使我能够更高效地开发和维护Java应用程序。