资讯动态

面向对象--继承、super、this、抽象类(OOP--面向对象编程)

发布时间:2026/9/24 13:53:12 来源:尧图企业网站定制
一、继承1.1概述概念就是子类继承父类的属性和行为使子类具有与父类相同的属性属性和行为直接 访问父类中的非私有的属性和行为。作用解决代码冗余问题即提高了代码的复用性问题让多个类存在了依赖关系开发原则高内聚低耦合降低类与类之间的依赖关系1.2继承的格式class 父类{……}class 子类 extends 父类{……}继承演示例//父类--员工类class Employee{String name//定义name属性//定义员工方法public void work{System.out.println(尽心尽力地工作)}}/*- 定义讲师类Teacher 继承 员工类Employee*/class Teacher extends Employee {// 定义一个打印name的方法public void printName() {System.out.println(name name);}}/*- 定义测试类*/public class ExtendDemo01 {public static void main(String[] args) {// 创建一个讲师类对象Teacher t new Teacher();// 为该员工类的name属性进行赋值t.name 小明;// 调用该员工的printName()方法t.printName(); // name 小明// 调用Teacher类继承来的work()方法t.work(); // 尽心尽力地工作}}1.3继承的特点成员变量成员变量不重名如果子类父类中出现不重名的成员变量这时的访问是没有影响的。代码如下class Fu {// Fu中的成员变量。int num 5;}class Zi extends Fu {// Zi中的成员变量int num2 6;// Zi中的成员方法public void show() {// 访问父类中的numSystem.out.println(Fu numnum); // 继承而来所以直接访问。// 访问子类中的num2System.out.println(Zi num2num2);}}class ExtendDemo02 {public static void main(String[] args) {// 创建子类对象Zi z new Zi();// 调用子类中的show方法z.show();}}演示结果Fu num 5Zi num2 6成员变量重名如果子类父类中出现重名的成员变量这时的访问是有影响的例class Fu {// Fu中的成员变量。int num 5;}class Zi extends Fu {// Zi中的成员变量int num 6;public void show() {// 访问父类中的numSystem.out.println(Fu num num);// 访问子类中的numSystem.out.println(Zi num num);}}class ExtendsDemo03 {public static void main(String[] args) {// 创建子类对象Zi z new Zi();// 调用子类中的show方法z.show();}}演示结果Fu num 6Zi num 6子父类中出现了同名的成员变量时在子类中需要访问父类中非私有成员变量时需要使用 super 关键字修饰父类成员变量否则根据就近原则就只会输出子类的同名的成员变量 。super使用格式super.父类成员变量名子类代码则修改如下class Zi extends Fu {// Zi中的成员变量int num 6;public void show() {//访问父类中的numSystem.out.println(Fu num super.num);//访问子类中的numSystem.out.println(Zi num this.num);}}演示结果Fu num 5Zi num 6成员方法成员方法不重名则同上所述没有影响成员方法重名则会产生一种特殊情况叫做方法重写即子类中拥有与父类一模一样方法名称、参数列表、返回值类型相同的方法会出现覆盖效果它存在于子父类中或者接口与接口的现实类中例class Fu {public void show() {System.out.println(Fu show);}}class Zi extends Fu {//子类重写了父类的show方法public void show() {System.out.println(Zi show);}}public class ExtendsDemo05{public static void main(String[] args) {Zi z new Zi();// 子类中有show方法只执行重写后的show方法z.show(); // Zi show}}重写的应用子类可以根据需要定义特定于自己的行为。既沿袭了父类的功能名称又根据子类的需要重新实现父类方法从而进行扩展增强。比如新的手机增加来电显示头像的功能代码如下class Phone {public void sendMessage(){System.out.println(发短信);}public void call(){System.out.println(打电话);}public void showNum(){System.out.println(来电显示号码);}}//智能手机类class NewPhone extends Phone {//重写父类的来电显示号码功能并增加自己的显示姓名和图片功能public void showNum(){//调用父类已经存在的功能使用supersuper.showNum();//增加自己特有显示姓名和图片功能System.out.println(显示来电姓名);System.out.println(显示头像);}}public class ExtendsDemo06 {public static void main(String[] args) {// 创建子类对象NewPhone np new NewPhone()// 调用父类继承而来的方法np.call();// 调用子类重写的方法np.showNum();}}构造方法构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。构造方法的作用是初始化成员变量的。所以子类的初始化过程中必须先执行父类的初始化动作。子类的构 造方法中默认有一个 super() 表示调用父类的构造方法父类成员变量初始化后才可以给子类使用。代 码如下class Fu {private int n;Fu(){System.out.println(Fu());}}class Zi extends Fu {Zi(){// super调用父类构造方法super();System.out.println(Zi);}}public class ExtendsDemo07{public static void main (String args[]){Zi zi new Zi();}}输出结果FuZi一、创建对象时先调用自己的构造函数子类构造函数的首行默认调用父类的无参构造函数或者自己手动调用父类已经存在的构造函数super调用父类无参构造函数super参数参数…… 调用父类有参构造函数class Fu {private int n;//无参Fu(){System.out.println(Fu());}//有参public Fu(int n) { this.n n; } public int getN() { return n; }}class Zi extends Fu {//super参数参数…… 调用父类有参构造函数public Zi(int n) { super(n); }Zi(){// super调用父类无参构造方法super();System.out.println(Zi);}}public class ExtendsDemo07{public static void main (String args[]){Zi zi new Zi();}}④、继承中变量的使用、方法调用⑤、关键字this、superthis在本类中使用this.变量访问本类的变量this.方法参数调用本类的方法this参数调用本类构造函数super在子类中使用super.变量访问父类的变量super.方法参数调用父类的方法super参数调用父类构造函数子类的每个构造方法中均有默认的super()调用父类的空参构造。手动调用父类构造会覆盖默认super().super() 和 this() 都必须是在构造方法的第一行所以不能同时出现。继承的特点Java只支持单继承不支持多继承但支持多层继承二、抽象类2.1使用abstract关键字修饰的类 --抽象类特点不能被实例化不能创建对象抽象类可以拥有与普通Java类一样的东西抽象类可以选择拥有抽象方法抽象类中的构造函数-是提供给子类进行使用普通Java类去继承抽象类必须实现抽象类中的所有抽象方法2.2 abstract使用格式抽象方法使用 abstract 关键字修饰方法该方法就成了抽象方法抽象方法只包含一个方法名而没有方法体。定义格式修饰符 abstract 返回值类型 方法名 (参数列表)例public abstract void run()抽象类--使用abstract关键字修饰的类​ 如果一个类包含抽象方法那么该类必须是抽象类。定义格式abstract class 类名字 {}例public abstract class Animal {public abstract void run()}抽象的使用继承抽象类的子类必须重写父类所有的抽象方法。否则该子类也必须声明为抽象类。最终必须有子类实现该父类的抽象方法否则从最初的父类到最终的子类都不能创建对象失去意义。public class Cat extends Animal {public void run (){System.out.println(小猫在墙头走~~~)}}public class CatTest {public static void main(String[] args) {// 创建子类对象Cat c new Cat();// 调用run方法c.run();}}输出结果小猫在墙头走~~~此时的方法重写是子类对父类抽象方法的完成实现我们将这种方法重写的操作也叫做实现方法。1. 抽象类不能创建对象如果创建编译无法通过而报错。只能创建其非抽象子类的对象。###### 理解假设创建了抽象类的对象调用抽象的方法而抽象方法没有具体的方法体没有意义。2. 抽象类中可以有构造方法是供子类创建对象时初始化父类成员使用的。###### 理解子类的构造方法中有默认的super()需要访问父类构造方法。3. 抽象类中不一定包含抽象方法但是有抽象方法的类必定是抽象类。###### 理解未包含抽象方法的抽象类目的就是不想让调用者创建该类对象通常用于某些特殊的类结构设计。4. 抽象类的普通子类必须重写抽象父类中所有的抽象方法否则编译无法通过而报错。除非该子类也是抽象类。###### 理解假设不重写所有抽象方法则类中可能包含抽象方法。那么创建对象后调用抽象的方法没有意义。##### 模板设计模式模板类package case9;/*** 模板类** 银行办理业务一般要经过以下4个流程取号、排队、办理具体业务、对银行工作人员进行评分等*/public abstract class Template {/*** 具体业务方法*/public void business(){System.out.println(取号);System.out.println(排队);service();System.out.println(对银行工作人员评分);}/*未知业务方法*/public abstract void service();}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价