面向对象程序三大特性一:继承(超详细)

news2024/11/18 3:30:05

目录

1.继承基本介绍

2.继承关系中的成员访问 

2.1就近原则

2.2继承关系中的构造方法

 3.super和this

4.代码块和构造方法的执行顺序

4.1在没有继承关 系时的执行顺序。

4.2继承关系上的执行顺序 

 5.protected的 范围

 6.继承的本质分析(重要)

7.final 关键字


1.继承基本介绍

当多个类存在相同的属性(变量)和方法时 , 可以从这些类中 抽象出父类, 在父类中定义这些相同的属性和方法所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。

继承主要解决的问题是:共性的抽取,实现代码复用 

基本语法:

class 子类 extends 父类{

} 

(1) 子类又叫派生类。

(2)父类又叫基类超类。

子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。

子类会将父类中的成员变量或者成员方法继承到子类中

包括父类的private

因为访问修饰限定符只能决定访问权限,不能决定能不能被继承。

但是父类的private,子类不能直接访问要通过方法。

总结:

子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问

2.继承关系中的成员访问 

2.1就近原则

先看两段代码

(1)

public class Test1 extends Base{
    int a=199;
    public static void main(String[] args) {
        Test1 text=new Test1();
        System.out.println(text.a);
       text.fun();
    }
    public void fun(){
        System.out.println(a);
        System.out.println(this.a);
        System.out.println(this.b);
        System.out.println(super.a);
    }
}

class Base{
    int a=99;
    int b=33;

}

(ps:super是关键字,该关键字主要作用:在子类方法中访问父类的成员。先知道这么多就行) 

输出什么?

 答案:

 (2)

public class Text0 extends Base0{
    public void method(){
        System.out.println("我是Text0的method()");
    }
    public static void main(String[] args) {
       Text0 t= new Text0();
       t.method();
       t.method2();
    }
    public void method2(){
        super.method();
        this.fun();
    }
}
class Base0{
    public void method(){
        System.out.println("我是Base0的method()");
    }
    public void fun(){
        System.out.println("我是Base0的fun()");
    }

}

输出什么?

 答案:

这说明了什么呢?我们可以得到什么结论?

成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找
也就是说 优先在子类中找,找到则访问,否则在父类中找,找到 则访问,否则编译报错。

2.2继承关系中的构造方法

子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。
所以在构造子类对象时候 , 先要调用基类的构造方法,将从基类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整

先看代码

public class Base {
public Base(){
System.out.println("Base()");
}
public Base(int a){
System.out.println("Base(int a)");
}
}
public class Derived extends Base{
public Derived(){
// super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
// 并且只能出现一次
System.out.println("Derived()");
}
public Derived(int a){
super(a);
System.out.println("Derived(int a)");
}
}
public class Test {
public static void main(String[] args) {
Derived d = new Derived();
Derived d2 = new Derived(4);
}
}
结果打印:
Base()
Derived ()
Base(int a)
Derived(int a)
这说明了什么呢?我们可以得到什么结论?
(1)子类必须调用父类的构造器, 完成父类的初始化。
(2)如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
(3)当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。

 3.superthis

相同点
(1)  都是 Java 中的关键字。
(2)  只能在类的非静态方法中使用 ,用来访问非静态成员方法和字段。
(3)  在构造方法中调用时, 必须是构造方法中的第一条语句 ,并且不能同时存在。

不同点

(1) this是当前对象的引用 ,当前对象即调用实例方法的对象, super相当于是子类对象中从父类继承下来部分成 员的引用。

 (2)在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性。

(3)在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造 方法中出现。

(4)构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

 在继承中的关系


4.代码块和构造方法的执行顺序

4.1在没有继承关 系时的执行顺序。

class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("构造方法执行");
}
{
System.out.println("实例代码块执行");
}
static {
System.out.println("静态代码块执行");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person("bit",10);
System.out.println("============================");
Person person2 = new Person("gaobo",20);
}
}
执行结果:
静态代码块执行
实例代码块执行
构造方法执行
============================
实例代码块执行
构造方法执行
小结:
1. 静态代码块先执行,并且只执行一次,在类加载阶段执行
2. 当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

4.2继承关系上的执行顺序 

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 TestDemo4 {
public static void main(String[] args) {
Student student1 = new Student("张三",19);
System.out.println("===========================");
Student student2 = new Student("gaobo",20);
}
public static void main1(String[] args) {
Person person1 = new Person("bit",10);
System.out.println("============================");
Person person2 = new Person("gaobo",20);
}
}
执行结果:
Person :静态代码块执行
Student :静态代码块执行
Person :实例代码块执行
Person :构造方法执行
Student :实例代码块执行
Student :构造方法执行
===========================
Person :实例代码块执行
Person :构造方法执行
Student :实例代码块执行
Student :构造方法执行
通过分析执行结果,得出以下结论:
1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

 5.protected的 范围

为了实现封装特性, Java 中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其
他包中被访问。
我们只看范围在不同包中的子类的例子
package Dome2;

public class Text3 {
    protected int x=100;
    protected int y=110;
}
package Dome;

import Dome2.Text3;

public class Text2 extends Text3 {
    public void fun()
    {
        System.out.println(super.x);
        System.out.println(super.y);
        System.out.println(x);
        System.out.println(y);
    }

    public static void main(String[] args) {
       Text2 t= new Text2();
        System.out.println(t.x);
        t.fun();

    }
}

运行结果:

 6.继承的本质分析(重要)

class Grandpa{

String name="爷爷";

}

class Father extends Grandpa {

String name="爸爸";

}

class Son extends Father {

String name="儿子";

}

当new Son的时候,内存的分布(重要)

 注意:

(1)父类构造器的调用不限于直接父类!将一直往上追溯直到 Object (顶级父类)

(2)先加载类

  Object- >Grandpa->Father- >Son

(3)就地赋值(常量)- >堆区储存的引用指向常量池


7.final 关键字

final 关键可以用来修饰变量、成员方法以及类。
1. 修饰变量或字段,表示常量 ( 即不能修改 )
final int a = 10 ;
a = 20 ; // 编译出错

2. 修饰类:表示此类不能被继承

final public class Animal {
...
}
public class Bird extends Animal {
...
}
// 编译出错
Error :( 3 , 27 ) java : 无法从最终 com . bit . Animal 进行继

我们平时是用的 String 字符串类 , 就是用 final 修饰的 , 不能被继承 .

3. 修饰方法:表示该方法不能被重写 


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《动手学深度学习》-64注意力机制

沐神版《动手学深度学习》学习笔记,记录学习过程,详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 注意力机制 生物学中的注意力提示 灵长类动物的视觉系统接受了大量的感官输入,这些感官输入远远超出了大脑所能够完全处理的能力…

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…

台风来袭,这份避险防御指南一定收好

台风天气的到来&#xff0c;我们必须高度警惕&#xff01;大到暴雨、雷电、雷雨大风&#xff0c;甚至短时强降水等强对流天气&#xff0c;可能给我们的生活带来严重威胁。为了确保家人安全&#xff0c;让我们共同学习一些智慧防护措施&#xff0c;做好个人安全防范。定期关注天…

C++初阶之一篇文章让你掌握vector(理解和使用)

vector&#xff08;理解和使用&#xff09; 1.什么是vector&#xff1f;2.vector的使用2.1 vector构造函数2.2 vector迭代器&#xff08;Iterators&#xff09;函数2.2.1 begin()2.2.2 end()2.2.3 rbegin()2.2.4 rend()2.2.5 cbegin()、cend()、crbegin()和crend() C11 2.3 vec…

Java类集框架(二)

目录 1.Map&#xff08;常用子类 HashMap&#xff0c;LinkedHashMap&#xff0c;HashTable&#xff0c;TreeMap&#xff09; 2.Map的输出&#xff08;Map.Entry,iterator,foreach&#xff09; 3.数据结构 - 栈&#xff08;Stack&#xff09; 4.数据结构 - 队列&#xff08;Q…

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…

人工智能与物理学(软体机器人能量角度)的结合思考

前言 好久没有更新我的CSDN博客了&#xff0c;细细数下来已经有了16个月。在本科时期我主要研究嵌入式&#xff0c;研究生阶段对人工智能感兴趣&#xff0c;看了一些这方面的论文和视频&#xff0c;因此用博客记录了一下&#xff0c;后来因为要搞自己的研究方向&#xff0c;就…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——组合应用

在《使用Golang实现一套流程可配置&#xff0c;适用于广告、推荐系统的业务性框架——简单应用》中&#xff0c;我们看到了各种组合Handler的组件&#xff0c;如HandlerGroup和Layer。这些组件下面的子模块又是不同组件&#xff0c;比如LayerCenter的子组件是Layer。如果此时我…

Windows用户如何将cpolar内网穿透配置成后台服务,并开机自启动?

Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f; 文章目录 Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f;前置准备&#xff1a;VS Code下载后&#xff0c;默认安装即可VS CODE切换成中文语言 1. 将…

FSC 认证产品门户网站正式上线

【FSC 认证产品门户网站正式上线】 FSC 国际正式推出自助式服务平台——FSC认证产品门户网站。FSC 证书持有者均可通过该平台自行添加企业或组织的 FSC 认证产品&#xff0c;寻求更多商机&#xff1b;也可通过该门户申请参与亚马逊气候友好项目&#xff08;Amazon Climate-Frie…

低代码平台,让应用开发更简单!

一、前言 随着社会数字化进程的加速&#xff0c;旺盛的企业个性化需求和有限的专业开发人员供给之间的矛盾日益显著&#xff0c;业界亟需更快门槛、更高效率的开发方法和工具&#xff0c;低代码技术便应运而生。 低代码开发&#xff0c;是通过编写少量代码甚至无需代码&#xf…

作为一个老程序员,想对新人说什么?

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

Vue3文本省略(Ellipsis)

APIs 参数说明类型默认值必传maxWidth文本最大宽度number | string‘100%’falseline最大行数numberundefinedfalsetrigger展开的触发方式‘click’undefinedfalsetooltip是否启用文本提示框booleantruefalsetooltipMaxWidth提示框内容最大宽度&#xff0c;单位px&#xff0c;…

数据结构--单链表OJ题

上文回顾---单链表 这章将来做一些链表的相关题目。 目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中的倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 ​编辑 10.环形链表II ​编辑 ​编辑 1.移除链表元素 思…

Camera之元数据(meta data)和原始数据(raw data)区别(三十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

JavaScript原生将图片转成base64

1.写个html文件 <!-- 产品照片 --> <div class"mb-3"> <label for"cover" class"form-label">产品图片</label><inputtype"file"class"form-control"id"coverfile"/> </div>…

这些你不容错过的音频转换器免费推荐给你

音频格式转换技术是一种能够将不同格式的音频文件互相转换的技术。你可能会想&#xff0c;为什么要进行音频格式转换呢&#xff1f;原因可是多种多样的&#xff01;有时候你可能收到了一个音频文件&#xff0c;但却无法在你的设备上播放&#xff0c;这时候就需要将其转换为兼容…

shiro快速入门

文章目录 权限管理什么是权限管理&#xff1f;什么是身份认证&#xff1f;什么是授权&#xff1f; 什么是shiro&#xff1f;shiro的核心架构shiro中的三个核心组件 shiro中的认证shiro中的授权shiro使用默认Ehcache实现缓存shiro使用redis作为缓存实现 权限管理 什么是权限管理…

从0到1学会手写操作系统,我只用了2个小时!!!

继《自己动手做一台计算机》 《嵌入式入门-模电基础》两大教程之后 黑马嵌入式教程再出力作 重磅发布第三弹 《自己动手写嵌入式操作系统》 问&#xff1a;嵌入式开发不是只学单片机就行&#xff1f;为什么要学操作系统&#xff1f; 答&#xff1a;年轻人&#xff0c;别把路…

LeetCode每日一题Day4——26. 删除有序数组中的重复项

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …