JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)

一、继承

继承 (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];

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在vue项目使用数据可视化 echarts ,柱状图、折线图、饼状图使用示例详解及属性详解

官网地址:Apache ECharts ​一、下载插件并在页面中引入 npm install echarts --save 页面导入: import * as echarts from echarts 全局导入: main.js 中,导入并注册到全局 import echarts from echarts Vue.prototype.$echart…

Flume原理剖析

一、介绍 Flume是一个高可用、高可靠,分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制&…

日常开发中Git命令指北

Git基本操作 创建化仓库 mkdir 目录 cd 目录 git init配置本地仓库 # 配置用户名,邮箱 git config user.name "cxf" git config user.email "1969612859qq.com" # 查看本地配置(小写的 L) git config -l # 重置配置&a…

【SpringCloud】RabbitMQ基础

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点(golang/boomer) 问题 资料获取方法 背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能…

将程序添加到右键菜单快速启动

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 效果如下 以 Windows Terminal 为例 打开注册表编辑器:按下 Win R 键,输入 regedit,然后按回车键打开注册表编辑器。 在注册表编辑器中导航到以下路径: HKE…

LabVIEW对并行机器人结构进行建模仿真

LabVIEW对并行机器人结构进行建模仿真 为了对复杂机器人结构的数学模型进行建模、搜索、动画和验证,在工业机器人动态行为实验室中,设计并实现了具有五个自由度的单臂型机器人。在研究台上可以区分以下元素:带有直流电机和编码器的机器人;稳…

新的里程碑!纪念正月十六工作室博客总访问量突破两百万

时值盛夏,清风徐徐,不觉间我们的博客访问量又迈入了新的里程碑——访问量突破两百万! 总访问量突破百万: 个人成就: 记得上次突破重大里程碑还是去年夏天,那时我们重修岳阳楼,追往忆&#…

【2.1】Java微服务:详解Hystrix

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: Java微服务 ✨特色专栏: 知识分享 &am…

考研408 | 【计算机网络】 数据链路层

导图: 数据链路层概念: 结点:主机、路由器 链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。 数据链路:网络中两个结点之间的逻辑通道&#xff0…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构,参数化配置是一个非常重要的点,而Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比其他客户端具备更多生产级特性,也更灵活。*在NetflixOSS微服务技术栈…

uni-app使用vue语法进行开发注意事项

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用(类似)小程序 语法/结构 使用vue 具体项目目录如下: 生命…

intelJ IDEA\PHPStorm \WebStorm\PyCharm 通过ssh连接远程Mysql\Postgresql等数据库

最容易出错的地方是在general面板下的host,不应该填真实的host地址,而应该填localhost或者127.0.0.1 具体操作步骤见下图

opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以…

[OnWork.Tools]系列 05-系统工具

简介 系统工具主要是将Window常用工具的快捷启动的集合 双击快速启动 计算器,记事本,截图,画图工具 控制面板,服务管理,关闭显示器,关机 启动文件夹,我的电脑,管理工具 右键菜单 添加快捷方式到桌面

React diff 根据相对位置的 diff 算法

文章目录 diff 算法没有 key 时的diff通过 key 的 diff查找需要移动的节点移动节点添加新元素移除不存在的元素缺点 diff 算法 没有 key 时的diff 根据新旧列表的长度进行 diff 公共长度相同的部分直接patch新列表长度>旧列表长度则添加,否则删除 function pa…

WPF实战项目十一(API篇):待办事项功能api接口

1、新建ToDoController.cs继承基础控制器BaseApiController,但是一般业务代码不写在控制器内,业务代码写在Service,先新建统一返回值格式ApiResponse.cs: public class ApiResponse{public ApiResponse(bool status, string mess…

git 报错 protocol ‘https‘ is not supported解决

报错原因:选择不了其他分支代码,甚至都看不到其他分支,我这边解决了两次报错,情况如下: 第一种报错: idea中刷新分支报错如下: Fetch Failed protocol https is not supported 话不多说&#…

【安装部署】Mysql下载及其安装的详细步骤

1.下载压缩包 官网地址:www.mysql.com 2.环境配置 1.先解压压缩包 2.配置环境变量 添加环境变量:我的电脑--->属性-->高级-->环境变量-->系统变量-->path 3.在mysql安装目录下新建my.ini文件并,编辑my.ini文件 编辑内容如…

基于TF-IDF+TensorFlow+词云+LDA 新闻自动文摘推荐系统—深度学习算法应用(含ipynb源码)+训练数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境TensorFlow环境方法一方法二 模块实现1. 数据预处理1)导入数据2)数据清洗3)统计词频 2. 词云构建3. 关键词提取4. 语音播报5. LDA主题模型6. 模型构建 系统测试工程源代码下载…