Java-类的继承
发布时间:2026/11/3 2:14:38 锦皓数字建站

1.继承1.1为什么要继承Java中使用类类经过实例化之后的产物对象则可以用来表示现实中的实体事物之间可能会存在一些关联在设计程序中需要考虑事物类之间的关联从而使代码更方便也更有结构性。如下两个例子public class Dog{ public String name; public String gander; public int age; public void eat(){ System.out.println(name正在吃饭); } public void sleep(){ System.out.println(name正在睡觉); } public void bark(){ System.out.println(name汪汪汪~); } } public class Cat{ public String name; public String gander; public int age; public void eat(){ System.out.println(name正在吃饭); } public void sleep(){ System.out.println(name正在睡觉); } public void mew(){ System.out.println(name喵喵喵~); } }如上在两个同为动物的Dog类和Cat类在其成员变量相同方法eat和sleep相同只有bark与mew不同1.2继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段它允许程序员在保持原有类特 性 的基础上进行扩展增加新功能这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构 体现了由简单到复杂的认知过程。继承主要解决的问题是共性的抽取实现代码复用。如上方的Dog与Cat类我们可以创建一个Animal类来作为他们的父类public class Animal(){ public String name; public String gander; public int age; public void eat(){ System.out.println(name正在吃饭); } public void sleep(){ System.out.println(name正在睡觉); } }把相同的成员变量和方法放入一个类中只需要在继承之后加入自己所需的类。1.3继承的语法在Java中如果想要表达类与类之间继承的关系需要借助extends关键字。注意Java不支持多继承修饰符 class子类extends父类{//...}我们再将上面的Dog类和Cat类用继承来实现 public class Animal(){ //父类 public String name; public String gander; public int age; public void eat(){ System.out.println(name正在吃饭); } public void sleep(){ System.out.println(name正在睡觉); } } public class Dog extends Animal{ //子类1 public void bark(){ System.out.println(name汪汪汪~); } } public class Cat extends Animal{ //子类2 public void mew(){ System.out.println(name喵喵喵~); } } 注意1. 子类会将父类中的成员变量或者成员方法继承到子类中了2. 子类继承父类之后必须要新添加自己特有的成员体现出与基类的不同否则就没有必要继承了1.4父类成员的访问子类中成员变量与方法都继承了那么怎么去访问父类的成员变量与方法呢1.4.1子类中访问父类的成员变量1.子类与父类不存在同名变量public class A{ int a; int b; } public class B{ public int c; public int d; public void Method(){ a1; //父类继承来的a b1; //父类继承来的b c1; }2.子类与父类存在同名变量如果访问的成员变量子类中有优先访问自己的成员变量。如果访问的成员变量子类中无则访问父类继承下来的如果父类也没有定义则编译报错。如果访问的成员变量与父类中成员变量同名则优先访问自己的。public class Base { int a; int b; int c; } public class Derived extends Base{ int a; // 与父类中成员a同名且类型相同 char b; // 与父类中成员b同名但类型不同 public void method(){ a 100; // 访问子类自己新增的a b 101; // 访问子类自己新增的b c 102; // 访问父类继承下来的c // d 103; // 编译失败因为父类和子类都没有定义成员变量b } }1.4.2子类中访问父类的成员方法1.成员方法名字不相同public class Base { public void methodA(){ System.out.println(Base中的methodA()); } } public class Derived extends Base{ public void methodB(){ System.out.println(Derived中的methodB()方法); } public void methodC(){ methodB(); // 访问子类自己的methodB() methodA(); // 访问父类继承的methodA() // methodD(); // 编译失败在整个继承体系中没有发现方法methodD() } }2.子类与父类有同名变量public class Base { public void methodA(){ System.out.println(Base中的methodA()); } public void methodB(){ System.out.println(Base中的methodB()); } } public class Derived extends Base{ public void methodA(int a) { System.out.println(Derived中的method(int)方法); } public void methodB(){ System.out.println(Derived中的methodB()方法); } public void methodC(){ methodA(); // 没有传参访问父类中的methodA() methodA(20); // 传递int参数访问子类中的methodA(int) methodB(); // 直接访问则永远访问到的都是子类中的methodB()基类的无法访问到 } }总结通过子类对象访问父类与子类中不同名方法时优先在子类中找找到则访问否则在父类中找找到 则访问否则编译报错。通过派生类对象访问父类与子类同名方法时如果父类和子类同名方法的参数列表不同(重载)根据调用 方法适传递的参数选择合适的方法访问如果没有则报错1.5 super关键字有些场景中子类需要访问父类的成员对此Java提供了super关键字该关键字主要作用在子类方法中访问父 类的成员。public class Base { int a; int b; public void methodA(){ System.out.println(Base中的methodA()); } public void methodB(){ System.out.println(Base中的methodB()); } } public class Derived extends Base{ int a; // 与父类中成员变量同名且类型相同 char b; // 与父类中成员变量同名但类型不同 // 与父类中methodA()构成重载 public void methodA(int a) { System.out.println(Derived中的method()方法); } // 与基类中methodB()构成重写(即原型一致重写后序详细介绍) public void methodB(){ System.out.println(Derived中的methodB()方法); } public void methodC(){ // 对于同名的成员变量直接访问时访问的都是子类的 a 100; // 等价于 this.a 100; b 101; // 等价于 this.b 101; // 注意this是当前对象的引用 // 访问父类的成员变量时需要借助super关键字 // super是获取到子类对象中从基类继承下来的部分 super.a 200; super.b 201; // 父类和子类中构成重载的方法直接可以通过参数列表区分清访问父类还是子类方法 methodA(); // 没有传参访问父类中的methodA() methodA(20); // 传递int参数访问子类中的methodA(int) // 如果在子类中要访问重写的基类方法则需要借助super关键字 methodB(); // 直接访问则永远访问到的都是子类中的methodA()基类的无法访问到 super.methodB(); // 访问基类的methodB() } }在子类中想要访问父类的方法使用super即可1.6子类构造方法1.6.1继承没有参数的构造方法在基类没有参数的构造方法子类直接写即可在子类的构造方法中编译器会帮你补充super。public class Base{ public Base(){ System.out.println(base()) } } public class Derived extends Base{ public Derived(){ //super(); 不写编译器会帮忙自动生成 System.out.println(Derived()) } } public class Test{ public stastic void main(String[] args){ }运行结果base()Derived()子类对象构造时需要先调用基类构造方法然后执行子类的构造方法。1.6.2继承有参数的构造方法子类在编写构造方法需要利用关键字super传递参数给基类 public class Base{ public int A; public Base(int A){ this.AA; } } public class Derived extends Base{ public int B; public Derived(int A,int B){ super(A); this.BB; } /* public Derived(int B){ super(1); //传递的参数不一定要从外获取 this.BB; } */ } public class Test{ public stastic void main(String[] args){ } 1.7初始化运行的顺序在类中不只有成员也有代码块在没有继承关系是先运行静态代码块有且只运行一次再有对象创建时先运行实例化代码块再进行构造方法在有继承关系下又该如何运行编写以下代码class Person { public String name; public int age; public Person(String name, int age) { this.name name; this.age age; System.out.println(Person构造方法执行); } { System.out.println(Person实例代码块执行); } static { System.out.println(Person静态代码块执行); } } class Student extends Person{ public Student(String name,int age) { super(name,age); System.out.println(Student构造方法执行); } { System.out.println(Student实例代码块执行); } static { System.out.println(Student静态代码块执行); } } public class Test{ public static void main(String[] args) { Student student1 new Student(张三,19); System.out.println(); Student student2 new Student(李四,20) } }运行结果为Person静态代码块执行Student静态代码块执行Person实例代码块执行Person构造方法执行Student实例代码块执行Student构造方法执行Person实例代码块执行Person构造方法执行Student实例代码块执行Student构造方法执行由此可见是先运行父类和子类静态代码块有且只运行一次在创建对象是再先运行父类的实例化代码与构造方法再运行子类的.1.8final关键字inal关键可以用来修饰变量、成员方法以及类。1. 修饰变量或字段表示常量(即不能修改)inal int a 10; a 20; // 编译出错2. 修饰类表示此类不能被继承inal public class Animal { ... } public class Bird extends Animal { ... } // 编译出错 Error:(3, 27) java: 无法从最终com.bit.Animal进行继
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。