继承—JavaSE

news2024/11/28 16:30:11

文章目录

  • 1.基础知识
    • 1.1继承的概念
    • 1.2语法
  • 2子类对从父类继承下来的成员的访问
    • 2.1对成员变量的访问
    • 2.2对成员方法的访问
  • 3.super关键字
    • 3.1访问父类的成员变量(super.变量)
    • 3.2访问父类的成员方法(super.方法)
    • 3.3调用父类的构造方法(super())
  • 4.this和super的区别
    • 4.1相同点
    • 4.2不同点
  • 5.代码块的执行顺序问题
  • 6.访问修饰限定符
    • 6.1同一包中的同一类
    • 6.2同一包中的不同类
    • 6.3不同包中的子类
    • 6.4不同包中的非子类
  • 7.java中支持的继承的方式
  • 8.final关键字
    • 8.1修饰变量或字段
    • 8.2修饰类
    • 8.3修饰方法
  • 9.组合

1.基础知识

1.1继承的概念

在保持原有类特性的基础上进行扩展,增加新功能,从而产生新的类,继承主要解决的问题是对共性的抽取,优点是可以实现代码复用

1.2语法

class A extends B{
}

其中:A是子类,也叫派生类;B是父类,也叫基类、超类

class Animal {
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name + "正在吃");
    }
}
class Dog extends Animal {
    public void swim(){
        System.out.println(this.name + "正在游泳");
    }
}
class Bird extends Animal {
    public String wing;//翅膀
    public void fly() {
        System.out.println(this.name + "正在飞");
    }
}
public class TextDame1 {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.name = "可可";
        animal.eat();
        Dog dog = new Dog();
        dog.name = "小小";//继承了父类的成员变量
        dog.swim();
        dog.eat();//继承了父类的方法
        Bird bird = new Bird();
        bird.name = "大大";
        bird.fly();
    }
}

子类会将父类中的成员变量或者成员方法继承到子类中;子类继承父类之后,要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承
在这里插入图片描述

2子类对从父类继承下来的成员的访问

2.1对成员变量的访问

(1) 子类和父类不存在同名成员变量

class A {
    public int a;
    public int b;
}
class B extends  A {
    public int c;
    public void method(){
        a = 10;//访问从父类继承的
        b = 20;
        c = 30;//访问子类自己的
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
//结果:
//    10
//    20
//    30
}

(2)子类和父类存在同名成员变量时,优先访问子类自己的,自己没有才会访问父类的

class A {
    public int a;
    public int b;
}
class B extends  A {
    public boolean b;
    public int c;
    public void method(){
        a = 10;//访问从父类继承的
        b = false;//同名是优先访问子类自己的
        //b = 10;//会报错,因为是优先访问子类自己的,而子类的b的类型是Boolean,而不是整形
        c = 30;//访问子类自己的
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
//结果:
//    10
//    false
//    30
}

2.2对成员方法的访问

(1)子类和父类不存在同名成员方法

class A {
    public int a;
    public int b;
    public void funcA(){
        System.out.println("父类的funcA()方法");
    }
}
class B extends  A {
    public void funcB(){
        System.out.println("子类的funcB()方法");
    }
    public void method(){
        funcA();//调用父类的成员方法
        funcB();//调用子类自己的成员方法
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
//结果:
//父类的funcA()方法
//子类的funcB()方法
}

(2)子类和父类存在同名成员方法时,优先访问子类的成员方法,子类没有才到父类去找

class A {
    public void func(){
        System.out.println("父类的fun()方法");
    }
}
class B extends  A {
    public void func(){
        System.out.println("子类的func()方法");
    }
    public void method(){
        func();
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
//结果:
//    子类的func()方法
}

3.super关键字

super不能使用在静态方法中,super

3.1访问父类的成员变量(super.变量)

class A {
    public int a;
}
class B extends  A {
    public int a;
    public void method(){
        super.a = 10;//此时的a就是访问的父类的成员便量,但是不加super,默认就是子类自己的a
        a = 20;//等价于this.a = 20
        System.out.println(super.a);//10
        System.out.println(a);//20
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
}

3.2访问父类的成员方法(super.方法)

class A {
    public void func(){
        System.out.println("父类的fun()方法");
    }
}
class B extends  A {
    public void func(){
        System.out.println("子类的func()方法");
    }
    public void method(){
        super.func();//访问父类的func方法
        func();//访问子类的func方法,等价于this.func()
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
        b.method();
    }
//结果:
//    父类的fun()方法
//    子类的func()方法
}

3.3调用父类的构造方法(super())

子类继承了父类以后必须先帮助父类进行构造,帮助父类进行构造就是显示调用父类的构造方法,这里此时构造的意义就是分配内存,初始化从父类继承过拉里的父类成员

class A {
    public int a;
    public int b;
    public A(){
        System.out.println("父类不带参数的构造方法");
    }
}
class B extends  A {
    public int c;
    public B(){
        super();//当父类只有一个不带参数的构造方法的时候,子类默认会有super(),帮助父类进行构造
        System.out.println("子类不带参数的构造方法");
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
    }
//结果:
//    父类不带参数的构造方法
//    子类不带参数的构造方法
}
class A {
    public int a;
    public int b;
    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }
}
class B extends  A {
    public int c;
    //不加这个构造方法会报错,是因为,子类继承了父类以后必须先帮助父类进行构造
    public B(){
        super(30,20);
        System.out.println("B不带参数的构造方法");
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
    }
}

4.this和super的区别

4.1相同点

(1)都是java的关键字
(2)都只能在非静态方法中调用,用来访问非静态成员方法和变量
(3)在构造方法中调用,都必须放在构造方法的第一条,且不能同时存在

4.2不同点

(1)this是当前对象的引用,即当前实例方法的对象的引用;super是子类对象从父类继承过来的成员的引用
(2)在非静态成员方法中,this用来访问本类的方法和属性;super用来访问父类继承下来的方法和属性
(3)this是非静态成员方法的一个隐藏参数;super不是隐藏的参数
(4)成员方法中直接访问本类成员时,编译之后会将this还原,即本类非静态成员都是通过this来访问的;在子类中如果通过super访问父类成员,编译之后在字节码层面super实际是不存在的
(5) 在构造方法中,this(…)用于调用本类构造方法;super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
(6)构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有

class A {
    public int a;
    public int b;
    public A(){
        System.out.println("父类不带参数的构造方法");
    }

    public A(int a, int b) {
        this();//调用本类的不带参数的构造方法,这个不写就没有
        this.a = a;
        this.b = b;
        System.out.println("父类带两个参数的构造方法");
    }
}
class B extends  A {
    public int c;
    public B(){
    	//super();//调用父类的不带参数的构造方法,这个不写编译器会自动加上
        super(23,2);//调用父类的带两个参数的构造方法
        System.out.println("父类不带参数的构造方法");
    }
}
public class TextDame2 {
    public static void main(String[] args) {
        B b = new B();
    }
//结果:
//    父类不带参数的构造方法
//    父类带两个参数的构造方法
//    父类不带参数的构造方法
}

在这里插入图片描述

5.代码块的执行顺序问题

(1)父类静态代码块优先于子类静态代码块执行,且是最早执行
(2)父类实例代码块和父类构造方法紧接着执行
(3)子类的实例代码块和子类构造方法紧接着再执行
(4)第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行(静态的只有一份)

class Animal {
    public String name;
    public int age;
    static {
        System.out.println("Animal的静态代码块");
    }
    {
        System.out.println("Animal的实例代码块");
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Animal带有两个参数的构造方法");
    }
}
class Dog extends Animal {
    static {
        System.out.println("Dog的静态代码块");
    }
    {
        System.out.println("Dog的实例代码块");
    }

    public Dog() {
        super("小小", 2);
        System.out.println("Dog不带参数的构造方法");
    }
}
public class TextDame1 {
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        System.out.println("============");
        Dog dog2 = new Dog();
    }
//结果:
//    Animal的静态代码块
//    Dog的静态代码块
//    Animal的实例代码块
//    Animal带有两个参数的构造方法
//    Dog的实例代码块
//    Dog不带参数的构造方法
//    ============
//    Animal的实例代码块
//    Animal带有两个参数的构造方法
//    Dog的实例代码块
//    Dog不带参数的构造方法
}

6.访问修饰限定符

在这里插入图片描述

6.1同一包中的同一类

package extendsText;
public class TextDame2 {
    public int a = 10;
    protected int b = 20;
    int c = 30;
    private int d = 40;

    public static void main(String[] args) {
        TextDame2 textDame2 = new TextDame2();
        System.out.println("同一包中的同一类:" + textDame2.a);
        System.out.println("同一包中的同一类:" + textDame2.b);
        System.out.println("同一包中的同一类:" + textDame2.c);
        System.out.println("同一包中的同一类:" + textDame2.d);
    }
//结果:
//    同一包中的同一类:10
//    同一包中的同一类:20
//    同一包中的同一类:30
//    同一包中的同一类:40
}

6.2同一包中的不同类

package extendText;

public class TextDame2 {
    public int a = 10;
    protected int b = 20;
    int c = 30;
    private int d = 40;
}
package extendText;

public class TextDame1 {
    public static void main(String[] args) {
        TextDame2 textDame2 = new TextDame2();
        System.out.println("同一包中的不同类:" + textDame2.a);
        System.out.println("同一包中的不同类:" + textDame2.b);
        System.out.println("同一包中的不同类:" + textDame2.c);
//        System.out.println("同一包中的不同类:" + textDame2.d);报错,被private修饰的只能在当前类被访问,不同类中使不能访问的
    }
//结果:
//    同一包中的不同类:10
//    同一包中的不同类:20
//    同一包中的不同类:30
}

6.3不同包中的子类

package extendText;

public class TextDame2 {
    public int a = 10;
    protected int b = 20;
    int c = 30;
    private int d = 40;
}
package childText;

import extendText.TextDame2;

public class TextDame3 extends TextDame2 {
    public void method(){
        super.a = 50;
        super.b = 60;
//        super.c = 70;报错,没有写就就是包访问权限,只能在同一个包中访问
//        super.d = 80;报错,被private修饰的只能在当前类被访问
    }
}

6.4不同包中的非子类

package extendText;

public class TextDame2 {
    public int a = 10;
    protected int b = 20;
    int c = 30;
    private int d = 40;
}
package childText;

import extendText.TextDame2;

public class TextDame4 {
    public static void main(String[] args) {
        TextDame2 textDame2 = new TextDame2();
        System.out.println("不一包中的非子类:" + textDame2.a);
//        System.out.println("不一包中的非子类:" + textDame2.b);报错,protected修饰的再不同包中的非子类是不能被访问到的
//        System.out.println("不一包中的非子类:" + textDame2.c);报错,没有写就就是包访问权限,只能在同一个包中访问
//        System.out.println("不一包中的非子类:" + textDame2.d);报错,被private修饰的只能在当前类被访问
    }
}

7.java中支持的继承的方式

(1)单继承
(2)多层继承
(3)不同类继承同一个类
(4)java不支持多继承

8.final关键字

8.1修饰变量或字段

表示该字段或变量为常量

public class TextDame1 {
    public static void main(String[] args) {
        final int a = 10;
//        a = 20;报错,a被final修饰就是常量了,不能被修改
    }
}

8.2修饰类

该类不能被继承

final class A {

}
//报错,被final修饰的类不能被继承
//class B extends A{
//
//}

8.3修饰方法

该方法不能被重写

class A {
    public final void func(){
        System.out.println();
    }
}
class B extends A{
//    被final修饰的方法不能被重写
//    @Override
//    public void func() {
//    
//    }
}

9.组合

(1)继承是is-a的关系
(2)组合是has-a的关系,和继承类似,组合也是一种表达类之间关系的方式,也是能够达到代码重用的效果,组合仅仅是将一个类的实例作为另外一个类的字段

class A{

}
class B{

}
//组合
class  C{
    private A a;
    private B b;
}

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

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

相关文章

手把手教学Android游戏--轮船大战小游戏(文末有代码)

目录 1.1课程设计的目的 1.2本选题的内容要求 1.3 软件开发运行环境 2.1设计思路 2.2软件总体结构图 2.3主要功能模块的设计 3.1 开始界面模块 3.1.1进入游戏设计 3.1.2退出游戏设计 3.1.3开始界面主要代码 3.2 游戏主界面显示模块 3.2.1游戏界面设计 3.2.2游戏界面鱼雷、炸弹、…

【C++---面向对象预备】

C---面向对象预备 一 、内存的分区:1.1 代码区:1.2 全局区:1.3 栈区:1.4 堆区: 二 、引用:2.1、引用注意事项:2.2、引用作函数参数:2.3、引用作函数的返回值:2.4、引用的…

explain | 索引优化的这把绝世好剑,你真的会用吗?

对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。 一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题,如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导…

MAC电脑设置权限

​​​​​​​ click on your background to go to finderclick on go and go to folder /usrright click on local and do get infounlock the lock at the bottomclick sign and add your user to the list and give read/write privilegesclick on the gear sign at the …

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型&#xff1a; Map<String, Object> map new HashMap<>(); // 添加一些键值对 map.put("key1", 123); map.put("key2", true); map.put("key3", new Date())…

Android Studio入门

首先确保系统已经安装好JDK和Android SDK Android SDK的安装有两种方案 方案一&#xff1a;直接下载包安装 官网下载 国内下载 方案二&#xff1a;使用命令行工具进行安装 在Android Studio官网下载Command line tools 最新&#xff1a;如果使用 Android Studio&#xff0c;…

特征维度降维算法——平均影响值算法(MIV)免费MATLAB代码获取,西储大学数据为例

1. 原理概述 众所周知&#xff0c;常用的特征维度降维方法有主成分分析&#xff0c;因子分析法&#xff0c;平均值影响法。而平均影响值算法&#xff08;MIV&#xff09;是神经网络对输入变量进行降维的最好方法之一。 在神经网络模型实际应用中&#xff0c;由于没有明确的…

高压功率放大器的作用和用途是什么

高压功率放大器是一种用于产生高电压和高功率信号的电子设备&#xff0c;通常采用功率放大器电路来实现。它主要起到以下作用&#xff1a; 提供高电压信号 在一些应用中需要产生高电压信号&#xff0c;如高压变频器、医疗设备等。高压功率放大器可以提供稳定的高电压信号&#…

c4d云渲染几款好用的云渲染平台

C4D是指Maxon公司所开发的3D建模、动画和渲染软件Cinema 4D。它是一款非常流行的三维图形软件&#xff0c;被广泛用于电影、电视、游戏等领域中的动画制作、视觉效果、建筑可视化、工业设计、广告设计、虚拟现实等方面。其用户界面简单易用&#xff0c;功能丰富&#xff0c;可以…

之江实验室: 如何基于 JuiceFS 为超异构算力集群构建存储层 ?

今天&#xff0c;高性能计算结合人工智能技术正在推动科研创新。例如通过破解水稻基因密码推动作物育种从“试验选优”向“计算选优”发展&#xff0c;在医药领域快速分析分子与蛋白之间的相互作用&#xff0c;发现潜在的能够有效干预疾病发生的药物分子。 之江实验室就是上述科…

Apikit 自学日记: Apikit 如何发起测试

进入 API 文档详情页&#xff0c;点击上方 测试 标签&#xff0c;进入 API 测试页&#xff0c;系统会根据API文档自动生成测试界面并且填充测试数据。 填写请求参数 首先填写好请求参数。 请求头部 您可以输入或导入请求头部。批量导入的数据格式为 key : value &#xff0c;…

Linux之多线程(上)——Linux下的线程概念

文章目录 前言一、地址空间和页表1.二级页表2.例子 二、线程1.概念重新理解前面讲的进程&#xff1a;在内核的视角&#xff0c;进程是承担分配系统资源的基本实体。站在CPU角度&#xff0c;能否去识别当前调度的task_struct是进程还是线程&#xff1f;Linux下并不存在真正的线程…

漫谈程序员创业

很多程序员选择辞职创业&#xff0c;成为了自己公司的创始人或者合伙人。他们选择离开原有的公司&#xff0c;是因为想要实现自己的梦想&#xff0c;追求更高的创业成就。辞职创业是一项具有挑战性的决定&#xff0c;需要勇气、决心和毅力。一些成功的创业者通过坚持不懈和不断…

知乎视频发布软件使用方法视频

知乎视频发布软件使用方法视频&#xff0c;知乎批量发布软件效果怎么样 #小红书视频上传#抖音seo软件#网络推广#视频营销 软件有月卡、季卡、半年卡、年卡 【其中推荐&#xff1a;百家号 哔哩哔哩B站&#xff0c;微博等软件发帖】 服务时间&#xff1a;&#xff08;8&#xf…

Win10 IE11浏览器,您正在查看的页使用 Java,Microsoft 网站提供有关 Java 支持的更多信息 解决

最近工作需要支持下IE11浏览器&#xff0c;使用java applet控件。 以前IE10及以下版本都比较正常&#xff0c;但是IE11会出现一些比较奇怪的现象。 记录下解决的方法和过程&#xff0c;便于有需要的同学自取。 1.首先是报错&#xff0c;如下图所示&#xff1b;这个网上搜索了…

B站热点预测,提前解码流量关口

“追热点”是创作者的必修课。互联网信息更迭迅速&#xff0c;热点千变万化&#xff0c;今天是这个明天可能就不热了&#xff0c;或者敏锐度不够的创作者甚至会错过最佳进场时期&#xff0c;反倒蹭了热点但只抹到一点奶油。 与此同时&#xff0c;还很考验创作者对热点的发散性…

Layui禁止表格部分复选框,layui禁止表格自带第一列复选框,layui禁止表格部分复选框,layui获取表格复选框选中数据

前言 禁止某些行可以勾选操作&#xff0c;及选中后的操作和行操作 效果 实现 执行一个table示例 <table id"data_table" class"layui-hide" lay-filter"data_table"></table>cols 的第一列就是需要重写的复选框 table.render({…

为什么针对API的Bot自动化攻击越来越多?

API是连接现代应用程序的基石&#xff0c;越来越多的企业意识到API的重要性&#xff0c;其数量迎来爆发式增长&#xff0c;但API面临的安全威胁却比API调用增长更加迅猛。Salt Security于今年2月发布的报告显示&#xff0c;2022年有91%的公司存在与API相关的安全问题&#xff0…

门禁巨头遭勒索攻击,北约、阿里集团等多个实体受到影响

Cyber News 网站披露&#xff0c;疑似与俄罗斯有关的勒索软件团伙 ALPV/BlackCat 袭击了安全门禁制造商Automatic Systems&#xff0c;北约、阿里巴巴、泰雷兹等多个实体组织可能受到影响。 攻击事件发生后&#xff0c;ALPV/BlackCat 在暗网泄露网站上发布了安全门禁制造商 Aut…

基于Citespace、vosviewer文献计量学发表的论文-让您增加一条轻松搞定SCI论文途径

Citespace和vosviewer是使用最广泛的文献信息可视化软件工具&#xff0c;在理工、经管、法学、教育、农学、文史、医学、艺术等学科中普遍应用&#xff0c;发文量逐年显著上升。理论与实践相结合&#xff0c;通过文献计量学讲解、高效选题、数据库检索数据下载、软件使用等八个…