extends继承

2024-04-15 22:28
文章标签 继承 extends

本文主要是介绍extends继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

什么时候用继承?

继承的格式?

继承的特点

子类可以继承父类的哪些呢?

是否可以继承父类的构造方法呢?

是否可以继承成员变量?

是否可以继承成员方法?


在Java中,extends关键字用于实现继承关系。通过使用extends关键字,一个类可以继承另一个类的属性和方法。

继承允许我们通过创建更具体的子类来扩展和改进现有的类。子类可以访问父类中的公共方法和属性,并可以添加自己的方法和属性。通过继承,我们能够实现代码的重用性,并可以更好地组织和管理程序的结构。

什么时候用继承?

 当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码

继承的格式?

public class 子类extends 父类{}

继承的特点

 Java只支持单继承,不支持多继承,但支持多层继承。
多层继承:子类A继承父类B,父类B可以继承父类
每一个类都直接或者间接的继承于0bject 类

子类可以继承父类的哪些呢?

是否可以继承父类的构造方法呢

下面我们来一探究竟

先来个父类

class Fu{String name;int age;public Fu(){}public  Fu(String name,int age){this.name=name;this.age=age;}
}

再来个子类

class Zi extends Fu{}

下面我们就来测试一下

可以看到带参构造创建的子类对象报错了

idea建议我们创建一个构造方法

那上面的空参构造为什么没有报错呢?

一个类中如果没有构造方法,虚拟机会自动的给我们添加一个默认的空参构造

是否可以继承成员变量?

成员变量可以被继承。在面向对象编程中,子类继承父类时可以继承父类的成员变量。当子类继承父类时,子类将会拥有父类的所有成员变量和成员方法,包括私有的成员变量。子类对象可以直接访问继承下来的成员变量,或者通过父类的公用方法来间接访问。需要注意的是,如果子类需要对继承的成员变量进行修改,可以使用继承下来的成员变量进行赋值,或者通过继承过来的成员方法来操作。

是否可以继承成员方法?

虚方法表中的可以,否则不行

虚方法表(Virtual Method Table,VMT)是一种用于实现面向对象编程语言中的多态性的机制。在这些编程语言中,对象的方法可以被子类重写以实现不同的行为。虚方法表通过一个表格来记录对象的方法,这个表格中的每一项指向实际执行的方法。当使用对象的方法时,编译器会根据对象的类型在虚方法表中查找相应的方法,并调用它。

虚方法表是面向对象编程语言中的一个重要概念,它使得多态性得以实现。通过将方法的调用与方法的实际实现解耦,虚方法表允许程序在运行时动态地确定要调用的方法。

在很多面向对象编程语言中,每个对象都有一个指向其所属类的虚方法表的指针。这个指针指向一个特定类的虚方法表,在表中,每个方法都被分配了一个唯一的索引。当对象的方法被调用时,程序会根据对象的类型查找相应索引对应的方法,并调用它。

虚方法表的使用方便了对象的方法的重写和动态绑定,使得多态性得以实现。它是实现面向对象编程语言中的多态性的一种常用机制。

继承中成员变量的访问特点

就近原则:谁离我近,我就用谁

先在局部位置找,本类成员位置找,父类成员位置找,逐级往上。

我们在代码中看看

先写个Fu类

public class Fu {String name = "Fu";
}

再写个Zi类

public class Zi extends Fu {String name = "Zi";public void ziShow() {String name="ziShow";System.out.println(name);}
}

这个输出的结果会是什么呢 ?

下面我们进行测试

public class Test4 {public static void main(String[] args) {Zi zi = new Zi();zi.ziShow();}
}

可以看到,输出结果为ziShow

离它最近的是ziShow

如果我将Zi类中的String name="ziShow";删掉

这样答案又会是什么呢?

根据就近原则,他就会打印Zi

如果我将Zi类中的String name="Zi"也删掉

答案又会是什么?

它就会去Fu类中去寻找最近的

如果Fu类中也没有的话它就会报错

那我如果想将这三个name都输出出来该怎么办呢?

我们只需要这样输出就好了

System.out.println(name);//从局部位置开始往上找
System.out.println(this.name);//从本类成员位置开始往上找
System.out.println(super.name);//从父类成员位置开始往上找

继承中成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁
super调用,直接访问父类

我们来写个例子看看

先写个Person类

public class Person {public void eat(){System.out.println("吃米饭,吃菜");}public void drink(){System.out.println("喝水");}
}

再写个Student类

public class Student extends Person{public void lunch(){eat();drink();}
}

测试一下

public class Test5 {public static void main(String[] args) {Student student = new Student();student.lunch();}
}

结果为

先在本类中査看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法

我们再Student类中加上super

super是直接去父类中寻找

如果现在我将Student类中的代码改为

public class Student extends Person{public void lunch(){this.eat();this.drink();super.eat();super.drink();}public void eat(){System.out.println("吃牛排");}public void drink(){System.out.println("喝可乐");}
}

person类中还是

public class Person {public void eat(){System.out.println("吃米饭,吃菜");}public void drink(){System.out.println("喝水");}
}

 又会输出什么呢?

this先在本类中査看eat和drink方法,一看有就直接调用子类的方法了

super直接从父类中找eat和drink方法


到这里就要介绍方法的重写了

方法的重写

 当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法

@Override重写注解
1.@Override是放在重写后的方法上,校验子类重写时语法是否正确

2.加上注解后如果有红色波浪线,表示语法错误。

3.建议重写方法都加@Override注解,代码安全! 

public class Person {public void eat(){System.out.println("吃米饭,吃菜");}public void drink(){System.out.println("喝水");}
}
public class Student extends Person{public void lunch(){this.eat();this.drink();super.eat();super.drink();}@Overridepublic void eat(){System.out.println("吃牛排");}@Overridepublic void drink(){System.out.println("喝可乐");}
}

方法重写注意事项和要求

  1. 重写方法的名称、形参列表必须与父类中的一致。
  2. 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类
  4. 建议:重写的方法尽量和父类保持一致。
  5. 私有方法不能被重写。
  6. 子类不能重写父类的静态方法,如果重写会报错的。

5、与6、可以理解为只有被添加到虚方法表中的方法才能被重写 

未完待续

这篇关于extends继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907093

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

? extends T 和 ? super T分别是什么意思?有什么不同?

<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过add

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

c++ 类的继承详解

在 C++ 中,类的继承是一种面向对象编程(OOP)的特性,允许创建一个新的类(派生类)从一个已有的类(基类)派生。通过继承,派生类可以重用基类的属性和行为,并且可以扩展或修改这些行为。继承是一种代码重用和扩展的机制,使得派生类能够继承基类的特性并添加或修改特性。 1. 继承的基本语法 class Base {// 基类的成员};class Derived : public Base {//

C++ 第8章 继承

继承(Inheritance)是面向对象程序设计中软件重用的关键技术。 8.1 类之间的关系 一个大的应用程序,通常由多个类构成,类与类之间互相协同工作。 class Vehicle{int wheels;double weight;double loading;public:void initialize(int in_wheels, double in_weight);int get

C++ 菱形继承与虚拟继承的详解与代码示例

在C++中,多重继承虽然强大,但也会带来不少问题。特别是当继承链中出现菱形继承时,容易导致基类的重复实例化。本文将深入讨论菱形继承的问题,并详细解释如何通过虚拟继承来解决它。同时,给出一个简单的代码示例,并逐步解析输出结果。 什么是菱形继承? 菱形继承是指在多重继承中,同一个基类被多个派生类继承,而这些派生类又被另一个类继承,最终形成菱形结构,如下图所示: A/ \B C\ /D

C++_继承详解

继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承呈现了面向对象程序设计的层次结构,之前我们接触的复用都是函数复用,今天我们所讨论的继承是类设计层次的复用。 子类继承父类的成员后,父类的 成员函数 和 成员变量 都会变成子类的一部分,其中父类的成员函数与子类的成员函数使用的是同一个函数(构造

【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例

本文介绍C++的基本使用,用一个程序说明的基本运用,当然C++中的指针与运算符的重载这些特色东西还没有涉及,只是把编程中最基本的东西讲述一次, 与《【Python】Windows版本的python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类》(点击打开链接)是姊妹篇,据说这堆东西出书的话能写很多很多页,上课的话能上大半学期,真是醉了。 以下程