JavaSE【继承、初始化、pretected封装、组合】

news2024/9/21 10:35:13

一、继承

继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能 ,这样产生新的类,称 派生类
        继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。
        继承主要解决的问题是:共性的抽取,实现代码复用

(1)继承的语法

 

注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,要新添加自己的成员(一般是与其他子类不同的),便于区别。

 

继承是一种思想。对共性进行提取,减少代码的冗余,达到了代码复用的效果。

例如:

 (2)父类成员的访问

1.子类中访问父类的 成员变量

1)访问子类、父类成员变量 不同名

不同名直接访问 变量名或者 this.变量名

class Base{
    public int a;
    public int b;
}

//派生类(子类)
class Derived extends Base{
    public int c;
    public void method(){
        //访问从父类继承的a和b
        a = 1;
        b = 2;
        //访问子类自身的c
        c = 3;
    }
}

 

2)访问 子类、父类成员变量 同名

同名的情况下:(就近原则:优先子类自己)

当子类有该成员变量,优先访问子类自己的成员变量。

当子类当中不存在该成员变量,则访问父类继承下的。如果父类也没有,则编译报错

//基类(父类)
class Base{
    public int a = 10;
    public int b = 20;
}

//派生类(子类)
class Derived extends Base{
    public int a = 1;
    public void method(){
        //访问从父类继承的a和b
        System.out.println("a = "+a);//1
        System.out.println("b = "+b);//20
    }
}

public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

 如果要访问父类的成员变量,使用 super.变量名

 

 

 

2.子类中访问父类的 成员方法

1)访问 子类、父类成员方法 不同名

不同名,优先在子类中找,找到则访问,否则在父类中找,找到 则访问,否则编译报错。

class Base{
    public void method(){
        System.out.println("Base:父类成员方法!");
    }
}
class Derived extends Base{
    public void method2(){
        System.out.println("Derived:子类成员方法!");
    }
    public void test(){
        method();
        method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.test();
    }

}

 

2)访问 子类、父类成员方法 同名

同名,优先访问子类。子类没有,在父类继承的方法中找,父类没有,编译报错
class Base{
    public void method(){
        System.out.println("Base:父类成员方法!");
    }
}
class Derived extends Base{
    public void method(){
        System.out.println("Derived:子类成员方法!");
    }
    public void method2(){
        System.out.println("Derived:子类成员方法!");
    }
    public void test(){
        method();
        method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.test();
    }

}

 如果要访问父类方法,使用super.method

3.子类构造方法

子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

也就是说,子类在构造完成之前,一定要先帮助父类初始化

package demo1;

class Animal{
    public String name;
    public int age;
    public  void eat(){
        System.out.println(this.name+"正在吃饭~~");
    }

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

//    public Animal(){
//
//    }

}
//继承
//extends 拓展,扩展 继承
class Dog extends Animal{

//    public Dog(){
//        super();
//    }
    public Dog(String name, int age){
        //调用父类构造方法
        super(name,age);//帮助初始化 子类从父类继承过来的成员,并不会 生成父类对象
        System.out.println("Dog调用父类构造方法");

        //super("小黑",3);
    }
    public  void bark(){
        System.out.println(this.name+"旺旺叫~~");
    }
}
class Cat extends Animal{

    public  void miaomiao(){
        System.out.println(this.name+"喵喵叫~~");
    }

    public Cat(String name, int age) {
        super(name, age);
        System.out.println("Cat调用父类构造方法");

    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("小黑",3);
        dog.eat();
        dog.bark();

        System.out.println("==========");

        Cat cat = new Cat("小白",4);
        cat.eat();
        cat.miaomiao();
    }
}

 

1) 当给父类Animal提供了一个带参数的构造方法时,子类报错了

 

就是因为,在调用子类构造方法时,得先初始化父类变量,这样就不会报错了

 

 

 2)不带参数的构造方法时,没有报错。而且之前没写构造方法的时候,也没报错

 

 那是因为,没写的时候,默认会生成一个子类调用父类的构造方法

 注意:同this一样,只能调用1次。而且必须得放在构造语句的第一行

否则会像这样报错

 

 

要向打印 ,可以放在super语句的后面

 

 

 然后主函数调用写好的继承

 

 

 4.super和this的小总结

共性:
super.成员变量
super.成员方法
super()调用父类构造方法

**针对当前对象的父类

this.成员变量
this.成员方法
this()调用父类构造方法
**针对当前对象
不同:
1. this 是当前对象的引用,当前对象即调用实例方法的对象, super 相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中, this 用来访问本类的方法和属性, super 用来访问父类继承下来的方法和属性
3. 在构造方法中: this(...) 用于调用本类构造方法, super(...) 用于调用父类构造方法,两种调用不能同时在构造 方法中出现
4. 构造方法中一定会存在 super(...) 的调用,用户没有写编译器也会增加,但是 this(...) 用户不写则没有

 

二、再谈初始化  - 观察代码块执行顺序

package demo1;

class Animal{
    public String name;
    public int age;
    public  void eat(){
        System.out.println(this.name+"正在吃饭~~");
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类:构造方法");
    }

//    public Animal(){
//
//    }
    static {
        System.out.println("父类:静态代码块");
    }
    {
        System.out.println("父类:实例化代码块");

    }
}
//继承
//extends 拓展,扩展 继承
class Dog extends Animal{

//    public Dog(){
//        super();
//    }
    public Dog(String name, int age){
        //调用父类构造方法
        super(name,age);//帮助初始化 子类从父类继承过来的成员,并不会 生成父类对象
        System.out.println("子类:构造方法");

        //super("小黑",3);
    }
    public  void bark(){
        System.out.println(this.name+"旺旺叫~~");
    }

    static {
        System.out.println("子类:静态代码块");
    }
    {
        System.out.println("子类:实例化代码块");

    }
}
class Cat extends Animal{

    public  void miaomiao(){
        System.out.println(this.name+"喵喵叫~~");
    }

    public Cat(String name, int age) {
        super(name, age);
        System.out.println("Cat调用父类构造方法");

    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("小黑",3);
        
    }
    
}

通过分析执行结果,得出以下结论:

1父类静态代码块 优先于 子类静态代码块执行,且是最早执行

2父类实例代码块父类构造方法紧接着执行

3子类的实例代码块子类构造方法紧接着再执行

4第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

 当再实例化一个对象时,发现静态代码块没有被执行

 

 因为静态代码块只会执行一次 

 

三、protect 关键字

 protected常用在继承中

1.protected同一包中同一类可以访问

 

 2.protected同一包中不一类可以访问

 3.protected不同一包的子类可以访问。(这个继承的类必须时public访问权限) 

 

 4.注意:不能定义类的时候加Protected、Private

Java中不能这样写,语法不支持

 

 四、继承方式

 以动物为例,可以有很多继承,橘猫可以继承中华田园猫,中华田园猫可以继承猫,猫可以继承动物,动物也可以继续继承..

但是越往后继承,代码就会越复杂。 一般我们不希望出现超过三层的继承关系.

  1.继承方式 - Java中不支持多继承

注意: Java中不支持多继承。之后接口可以解决这个多继承的问题。

 2.fifinal 关键字

fifinal关键可以用来修饰变量、成员方法以及类。
当继承层次过多,不希望再继承的时候加上final, 代表当前类或者变量等,不能继承了

1)修饰变量 ,该变量就变成常量了,只能被初始化一次

只能初始化一次,这两种都可以

 

 2)修饰方法,表示当前该方法不能被继承了

所以这里继承的时候报错了

五、继承与组合

        和继承类似, 组合也是一种表达类之间关系的方式 , 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字 ), 仅仅是将一个类的实例作为另外一个类的字段。
继承表示对象之间是 is-a 的关系 ,比如:狗是动物,猫是动物
        继承抽取共性
组合表示对象之间是 has-a 的关系 ,比如:学校
        组合将所有类合并到一起复用

 组合

class Student{

}
class Teacher{

}
class Classroom{

}
class School{
    //组合,可以复用这些属性和方法
    public Classroom classroom;
    public Student[] students;//默认null
    public Teacher[] teachers;
    public int a;
    public School(){
        this.students = new Student[10];
        this.teachers = new Teacher[10];

    }
}

 

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

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

相关文章

MP4如何转MP3?教你简单好用的转换方法

怎么将MP4格式的视频转换成MP3音频呢?相信大家在看短视频的时候,有的视频背景音乐非常好听,我们又搜不到这个音频的源声在哪里,这时候我们就可以将这段视频直接转换成MP3格式音频,用来当做铃声或者是闹钟非常合适&…

Python web实战之 Django 的 MVC 设计模式详解

技术栈:Python、Django、HTML、CSS、JavaScript。 概要 在 Web 开发中,MVC(Model-View-Controller)模式是一种非常常见的设计模式,它可以帮助我们更好地管理代码,提高代码的可维护性。今天就介绍如何使用 …

量子力学的应用:量子通信和量子感应

亲爱的读者, 欢迎回到我们的量子力学系列文章。在前面的几篇文章中,我们已经深入探讨了量子力学的起源、基本概念、实验验证以及解释问题,以及量子计算的应用。今天,我们将继续探讨量子力学的另外两个引人注目的应用领域&#xf…

ubuntu git操作记录设置ssh key

用到的命令: 安装git sudo apt-get install git配置git用户和邮箱 git config --global user.name “用户名” git config --global user.email “邮箱地址”安装ssh sudo apt-get install ssh然后查看安装状态: ps -e | grep sshd4. 查看有无ssh k…

最新补丁让OpenBSD终于能够进行AMD CPU微码更新

导读最新的 OpenBSD”current”代码终于开始支持 AMD CPU 微代码更新。 通过本周末合并到 OpenBSD 中的一组补丁,现在用户可以更新 AMD 处理器的 CPU 微代码了。 ports/sysutils/firmware/amd 也被添加进来,用于推送所有的 AMD CPU 微代码二进制文件。 …

基于照片对天线进行全波分析(详细分解步骤)

诸如NFC、RFID和物联网系统传感器等无线应用均受益于印刷在塑料基板上的低成本天线。然而,当天线集成到系统中时,数据手册的指标与天线的实际行为及其与相邻结构的相互作用之间通常存在不匹配现象。在这种情况下,就需要执行更高级的分析&…

【严重】Smartbi商业智能BI软件权限绕过漏洞

漏洞描述 Smartbi是一款商业智能应用,提供了数据集成、分析、可视化等功能,帮助用户理解和使用他们的数据进行决策。 在Smartbi受影响版本中存在权限绕过问题,未授权的攻击者可以通过 RMI 的方式调用 getPassword 接口获取管理员token信息。…

高忆管理:创业板中签第一天卖吗?

跟着科技进步和改革开放的深入发展,我国的股票商场继续火热。随之而来的是越来越多的新股发行。关于股民们来说,怎么抢到新股成为了一个热点话题。在最近的一次创业板新股发行中,中签率再创新高,让不少股民欣喜不已。但是&#xf…

二、JVM-深入运行时数据区

深入运行时数据区 计算机体系结构 JVM的设计实际上遵循了遵循冯诺依曼计算机结构 CPU与内存交互图: 硬件一致性协议: MSI、MESI、MOSI、Synapse、Firely、DragonProtocol 摩尔定律 摩尔定律是由英特尔(Intel)创始人之一戈登摩尔(Gordon Moore)提出来…

输入框长度在XSS测试中如何绕过字符长度限制

大家好,这是我编写的第一篇文章,之所以会分享这个故事,是因为我花了几个晚上的时间,终于找到了解决某个问题的方法。故事如下: 几个月前,我被邀请参加一个非公共的漏洞悬赏项目,在初期发现了一些…

汽车行业案例 | 联合汽车电子全新质量问题管理平台上线,燕千云助力汽车电子领军者实现数字化质量管理

据权威调研机构显示,2022年中国智能电动汽车的销量已占新能源汽车的52%以上。到2025年,在新能源汽车50%的汽车出行市场渗透率的基础上,智能电动汽车的销量将超1220万辆,占新能源汽车的80.1%。在技术进步和产业变革快速推进的背景下…

curl命令详解及设置代理服务器

目录 概述 Linux Curl命令详解 Curl命令参数 Curl模仿浏览器命令 Curl模仿浏览器详解 模仿浏览器 Curl伪造refer命令 Curl伪造refer详解 伪造refer Curl下载文件或网页详解 Curl下载进度条命令 Curl下载进度条详解 Curl断点续传命令 Curl断点续传详解 断点续传 …

Kubernetes客户端认证—— 基于CA证书的双向认证方式

1、Kubernetes 认证方式 Kubernetes集群的访问权限控制由API Server负责,API Server的访问权限控制由身份验证(Authentication)、授权(Authorization)和准入控制(Admission control)三个步骤组成,这个三个步骤是按序进行的&#x…

Docker 安装 MySQL5.6

方法一、docker pull mysql 查找Docker Hub上的mysql镜像 #docker search mysql 这里我们拉取官方的镜像,标签为5.6 #docker pull mysql:5.6 (第一次启动Docker-MySql主要是查看Docker里面MySQL的默认配置,数据位置,日志位置,配…

Flink非对齐checkpoint原理(Flink Unaligned Checkpoint)

Flink非对齐checkpoint原理(Flink Unaligned Checkpoint) 为什么提出Unaligned Checkpoint(UC)? 因为反压严重时会导致Checkpoint失败,可能导致如下问题 恢复时间长-服务效率低非幂等和非事务会导致数据…

企业电子招投标采购系统源码之电子招投标的组成 tbms

功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

当我们在谈Web3时,其实谈的是什么?

当我们在谈Web3时,其实谈的是什么?虽然这个问题看似简单,但是Web3的定义却十分复杂。在这篇文章中,我们将尝试用简单易懂的语言来解答这个问题,并深入探讨Web3对未来的影响。 首先,Web3是什么?简…

通讯软件013——分分钟学会Kepware OPC AE Server仿真配置

本文介绍如何使用Kepware软件仿真OPC AE Server配置。相关软件可登录网信智汇(wangxinzhihui)下载。 1、创建1个数据源:本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”&am…

SpringBoot复习:(14)容器是怎么创建出来的?

在SpringApplication类的run方法。低版本和高版本的SpringBoot实现有区别。 低版本: run方法调用了createApplicationContext createApplicationContext代码如下: 它会根据contextClass来实例化一个容器然后返回. ¥¥&#xffe…

【设计模式——学习笔记】23种设计模式——命令模式Command(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 有一套智能家电,其中有照明灯、风扇、冰箱、洗衣机,这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个手机App来分别控制,希望只要一个app就可以控制全部智能家电要实现一个app控制所有智能家电的需要&…