Java入门第四节

news2025/1/20 20:11:53

Java入门第四节

一.继承 

问题:

隔壁的王阿姨养了一只猫和一只仓鼠,也想使用这个app,应该这么办

 解决: 

1.找出所有动物的共性(如.有名字,品种,年龄,吃饭,跑等等),创建一个共性类,为宠物类

package com.microsoft.bean;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

public class Animal {

    // 所在的小区
    private static String plot = "希望小区";

    // 名字
    private String name;

    // 种类
    private String variety;

    // 年龄
    private int age;

    // 食物
    private String food;


    // 方法的重写
    public void setName(String name) {
        if (name.length() < 20) {
            this.name = name;
        }else {
            System.out.println("你的宠物名字过长");
        }
    }
    public void setAge(int age) {
        if (age > 0 && age <30){
            this.age = age;
        }else {
            System.out.println("你的宠物年龄错误");
        }
    }

    public static String getPlotInstance(){
        return plot;
    }

    // 无参数构造函数(无参构造器)
    public Animal() {
    }

    // 有参数的构造函数(有参构造)
    public Animal(String name, String variety, int age, String food) {
        this.name = name;
        this.variety = variety;
        this.age = age;
        this.food = food;
    }


    // 我们要给所以宠物打疫苗
    public static void injection(){
        System.out.println("所以的宠物,月底打疫苗");
    }

    // 宠物的行为
    public void eat() {
        System.out.println(this.name+"吃饭");
    }

    public void sleep() {
        System.out.println(this.name+"睡觉");
    }

    public void run() {
        System.out.println(this.name+"正在奔跑");
    }

}

 2.创建猫类与仓鼠类,但是有发现了一个问题,我们不能把Dogs里的代码每个都写一遍吧,这样非常麻烦,所有我们要引入继承的概念;

继承:儿子继承了父亲的一些特性

(1).关键字extends的意思是“扩展”,子类是父类的扩展;

(2).Java中的类只有单继承,没有多继承;(一个儿子只有一个父亲,但是一个父亲可以有多个儿子)

(3).继承只能继承一些特性,有些特性是无法被继承

一.构造器(Constructor):子类不能继承父类的构造器,但可以通过super关键字调用父类的构造器。

二.final成员变量和方法:final修饰的成员变量和方法是不可修改的,无法被子类继承或覆盖。

需要注意的是,虽然接口(Interface)也可以被看作一种继承关系,但接口之间无法直接进行继承。一个类可以实现多个接口,但只能继承一个父类。

看不懂的,后面会讲

3. 使用继承

public class Hamster extends Animal{

}
public class Dogs extends Animal {
    
}
public class Cat extends Animal{

}

 

import com.microsoft.bean.Cat;
import com.microsoft.bean.Dogs;
import com.microsoft.bean.Earth;
import com.microsoft.bean.Hamster;

public class Application {
    public static void main(String[] args) {


        // 张大爷,注册APP,使用new实例化
        Dogs zhangDog = new Dogs();

        // 张大爷设置狗的状态
        zhangDog.setName("阿黄");
        zhangDog.setVariety("中华田园犬");
        zhangDog.setAge(10);
        zhangDog.setFood("剩菜剩饭");

        System.out.println("张大爷家狗的信息:" +zhangDog);

        // 王阿姨,注册APP
        Cat wangCat = new Cat();
        Hamster wangHamster = new Hamster();

        // 王阿姨设置猫的状态
        wangCat.setName("大橘");
        wangCat.setVariety("橘猫");
        wangCat.setAge(3);
        wangCat.setFood("小鱼干");

        // 王阿姨设置仓鼠的状态
        wangHamster.setName("小白");
        wangHamster.setVariety("不知道");
        wangHamster.setAge(1);
        wangHamster.setFood("白菜");

        System.out.println("王阿姨家猫的信息:" +wangCat);
        System.out.println("王阿姨家仓鼠的信息:" +wangHamster);

    }
}

二.多层继承

1.像灰太狼家族,一层一层的继承,爷爷传承到爸爸、爸爸传承到孙子;

2.一个类不能直接继承多个类,java是单继承语言,不支持多继承;

3.不能写成 class A extends B,C;

4.但可以实现继承多个类 class A extends B,class C extends A 这样C就同时继承了B和A两个类了;

如.狗继承宠物,拉布拉多继承狗

public class Dogs extends Animal{
}
public class Labrador extends Dogs {
}


 

三.Object 

可以有Ctrl+h查看继承关系:

从这里可以看出:

Object 类是所有类的父类, Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。我们创建一个类时,如果没有明确继承一个父类,那么它就会直接或间接的继承 Object,成为 Object 的子类;

Object的方法有:toString等等,具体如下

Java Object 类 | 菜鸟教程 (runoob.com)

四.方法重写 

 由于动物会叫所以我们要在宠物类中添加动物叫方法

 public void breaking() {
        System.out.println("宠物叫");
    }

出现问题王阿姨家的猫的叫声很奇怪,如何解决。

 使用方法的重写(父类的功能,子类不一定需要,或者不一定满足):

1.重写需要有继承关系,子类重写父类的方法;

2.方法名与参数必须相同;

3.修饰词:范围可以扩大但不能缩小(修饰词:public > protected > default > private)

4.抛出异常:范围,可以被缩小,但不能被扩大 (Exception > ClassNotfoundException)

3与4后面会讲,看不懂跳过

使用: 

package com.microsoft.bean;

public class Cat extends Animal{
    @Override
    public void breaking() {
        System.out.println("喵喵~~~~~");
    }
}

补充:

1.当我们使用外部库中的方法时,可以通过继承关系来重写(覆盖)该方法。

2.在Java中,静态方法是与类关联的方法,而不是与实例对象关联的方法。因为静态方法与类直接绑定,不依赖于对象的创建,所以无法被子类重写。父类中的静态方法只能被隐藏,而不能被子类中的同名静态方法所重写。你可以通过在子类中定义一个与父类静态方法同名的静态方法来隐藏父类中的静态方法。

五.super

 问题:由于子类不能继承父类的构造器,用户想要注册时初始化怎么办;

解决:我们使用前面教的快捷键,在每个子类上重新生成构造器;

package com.microsoft.bean;

public class Hamster extends Animal{
    @Override
    public void breaking() {
        System.out.println("仓鼠叫");
    }

    public Hamster() {
    }

    public Hamster(String name, String variety, int age, String food) {
        super(name, variety, age, food);
    }
}
package com.microsoft.bean;

public class Dogs extends Animal {
    @Override
    public void breaking() {

        System.out.println("汪汪~~~~~");
    }

    public Dogs() {
    }

    public Dogs(String name, String variety, int age, String food) {
        super(name, variety, age, food);
    }
}

package com.microsoft.bean;

public class Cat extends Animal{
    @Override
    public void breaking() {
        System.out.println("喵喵~~~~~");
    }

    public Cat() {
    }

    public Cat(String name, String variety, int age, String food) {
        super(name, variety, age, food);
    }
}

 如果你仔细观察会子类的构造方法与父类不一样,子类的构造方法中有关键字super,super关键字可以让子类调用父类的构造器。

效果:

import com.microsoft.bean.Cat;
import com.microsoft.bean.Dogs;
import com.microsoft.bean.Earth;
import com.microsoft.bean.Hamster;

public class Application {
    public static void main(String[] args) {


        // 张大爷,注册APP,使用new实例化
        Dogs zhangDog = new Dogs("阿黄","中华田园犬",10,"剩菜剩饭");

        System.out.println("张大爷家狗的信息:" +zhangDog);

        // 王阿姨,注册APP
        Cat wangCat = new Cat("大橘","橘猫",3,"小鱼干");
        Hamster wangHamster = new Hamster("小白","不知道",1,"白菜");

        System.out.println("王阿姨家猫的信息:" +wangCat);
        System.out.println("王阿姨家仓鼠的信息:" +wangHamster);

        // 王阿姨家的猫叫
        wangCat.breaking();

    }
}

super注意点: 

1.super调用父类的构造方法,必须在构造方法的第一个;

2.super必须只能出现在子类的方法或构造方法中;

3.super和this不能同时调用构造方法;

super与this的比较: 

superthis
对象代表父类对象的引用代表本身调用者这个对象
前提条件只能在继承条件下使用任何条件下
构造方法父类的构造方法本类的构造方法

六.final 

问题: 前面说过多层继承,狗类下面有拉布拉多类,但是拉布拉多下面就没有类了,所以就不能有类继承拉布拉多类,我们应该怎么办。有些父类的变量与方法不能让子类随意修改(如.小区名)我们应该怎么办;

解决: 前面说过final修饰的成员变量和方法是不可修改的,无法被子类继承或覆盖,通俗易懂的说就是用final定义的类不能再被继承,用fianl定义的方法不能再被重写,用final定义的变量是常量且不能再被修改;

使用:

public final class Labrador extends Dogs {

}
// 宠物的行为
    public final void eat() {
        System.out.println(this.name+"吃饭" +food);
    }

    public final void sleep() {
        System.out.println(this.name+"睡觉");
    }

    public final void run() {
        System.out.println(this.name+"正在奔跑");
    }
// 用final定义的变量是常理,而在命令规范中,常理必须大写,单词用下划线隔开

    private static final String COMMUNITY_NAME ="NanG";


    public static String getCommunityName(){
        return COMMUNITY_NAME;
    }

补充一些快捷方式:ctrl +shift+u一键大写,shift+f6一键更改变量 ;

七. 抽象方法和抽象类的使用

问题1: 如果王大爷注册的时候,不小心点错了,导致了下面这样的情况

        //  张大爷,注册APP,使用new实例化
        Animal zhangDOg = new Animal();

 Animal本质来说是没有人用的,它是一个抽象的,它抽取了这些猫狗的共性,作为使用;

我们在前面说过抽象与具体的概念,Animal是抽象的,Dogs是具体的,抽象的目的是为了概括(解释)这些具体事物;

于是张大爷打电话给客户说:他不小心点错了,没有给他家的狗注册,而注册成了宠物;

为了避免这种情况的发生我们应该怎么办;

解决: 我们已经知道了Animal是抽象的,所以我们引入抽象类的概念;

1.加入抽象类的关键词是 abstract ,抽象类是不能再被 new 的类,但是它可以被其他的类继承;

public abstract class Animal{

问题2: 前面我们说过重写动物的叫声,但是有一些动物的叫声是我不知道的,所以我们要去网上查一下它们是这么叫的,但是这样的代码有非常多,如果忘记会跟前面一样会输出宠物叫,我们应该这么解决这样问题;

解决: 使用抽象方法,概念如下;

1.只有方法名,没有方法的实现;

2.使用抽象方法那么类必须是抽象类;

3.当一个类继承了一个抽象类时候,该子类必须重写父类中所有抽象方法;

 public abstract void breaking();

 可以看出仓鼠类没有重写叫声的抽象方法,导致报错

 重写后,没有报错

到这里动物社区结束;

八.接口

假如有一个类中定义只有方法,且这些方法都是抽象方法,那么你可以直接把它定义为接口(interface)不用定义为普通的类(class);

如.我创建了一个人类接口,人类是抽象的

package com.microsoft.bean;

public interface Human {

    // 接口中所有方法都是抽象的

    // 吃饭,每个地区饮食是不一样的
    public void eat();

    // 喝水,每个地区是不一样的
    public void drink();
}

接口的实现,使用implements

之所以报错,是因为没有实现,接口的两个抽象方法 

package com.microsoft.bean;

public class Chinese implements Human {
    @Override
    public void eat() {
        System.out.println("吃中餐");
    }

    @Override
    public void drink(){
        System.out.println("喝热水");
    } 

    
}
package com.microsoft.bean;

public class Westerner implements Human{
    @Override
    public void eat() {
        System.out.println("吃西餐");
    }

    @Override
    public void drink(){
        System.out.println("喝冷水");
    }
}

 使用,与抽象类一样,接口是能new的

问题:抽象类与接口的区别 

抽象类:抽象类是针对具体的事物进行抽象,如.前面的猫,狗,仓鼠它们对具体的事物进行抽象,为宠物;

接口:接口是针对动作、行为进行抽象,原因是因为里面只有方法(行为)没有成员变量,且接口中避免出现名词,如.人类的行为动作,所有我们应该把前面的人类接口改成人类的行为接口;

package com.microsoft.bean;

public interface HumanBehaviour {

    // 接口中所有方法都是抽象的

    // 吃饭,每个地区饮食是不一样的
    public void eat();

    // 喝水,每个地区是不一样的
    public void drink();
}

补充:

1.普通类:只有具体实现;

2.抽象类:具体实现和规范(抽象方法)都有;

3.接口:只有规范! 约束和实现分离:面向接口的编程;

implements可以实现多个接口

public class Frog implements IRunning, ISwimming {
   
}

九.多态 

 例子:花木兰替父从军

父类(父亲)

package com.microsoft.bean;

public class HuaHu {

    public String name = "花胡";

    public int age = 45;

    public static void asyMe(){
        System.out.println("大家好我叫花胡,今年45岁");
    }

    public void fight(){
        System.out.println("干架");
    }

}

子类(女儿) 

​
package com.microsoft.bean;

public class HaMuLan extends HuaHu{

    public String name = "我叫花木兰";

    public int age = 19;

    public void dressing(){
        System.out.println("化妆");
    }
}

​

花木兰替父从军

战打完了,花木兰做回自己 

package com.microsoft.bean;

public class HuaMuLan extends HuaHu {
   
    public String name = "我叫花木兰";

    public int age = 19;

   public static void asyMe(){
       System.out.println("大家好我叫花木兰,今年19岁");
   }


    public void dressing() {
        System.out.println("化妆");
    }

}

可知多态具有多功能;

十. 权限修饰符

Java 修饰符 | 菜鸟教程 (runoob.com)

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

  • public : 对所有类可见。使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

我们可以通过以下表来说明访问权限:

访问控制
修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/N(说明)N
defaultYYYNN
privateYNNNN

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

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

相关文章

IDEA工具栏快捷按钮

如图 点击快速弹出创建class. 主要我9.9的鼠标右键不灵敏 方法 在工具栏右键 横杠出点 Add Action 没有横杠就点下一个

QLabel控件使用

Qt为我们应用程序界面开发提供的一系列的控件&#xff0c;下面我们介绍两种最常用一些控件&#xff0c;所有控件的使用方法我们都可以通过帮助文档获取。 1.QLabel控件使用 QLabel是我们最常用的控件之一&#xff0c;其功能很强大&#xff0c;我们可以用来显示文本&#xff0c…

0830hw

1.2.链式队列 head.h #include <myhead.h> typedef int datatype; typedef struct seq {union{datatype data;int len;};struct seq *next; }seq,*S; typedef struct PP {S front;S rear; }P; P *create(); void input_tail(P *p,datatype n); void pop_head(P *p); vo…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码&#xff0c;展示如何使用Python的程序化交易接口批量获取数据&#xff0c;例如开发文档参考&#xff1a;MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

使用STM32与TB6612FNG驱动直流减速电机

TB6612FNG介绍 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 AIN…

Java里面对int[]数组做新增删除去重实现

Java里面对int[]数组做新增删除去重实现 说明代码根据索引删除数组中的某个数据实现在数组中添加一个元素实现删除数组里面的重复数据去掉数组里面的重复数据&#xff0c;只保留一个 说明 这里记录下使用int[]数组对数组进行新增删除去重等操作&#xff0c;用来更加了解java里…

部署单点elasticsearch

部署elasticsearch 创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络 docker network create es-net 拉取镜像 我们采用elasticsearch的7.12.1版本的镜像 docker pull elasticsearch:7.12.1 运行 运行docker命令&a…

编译KArchive在windows10下

使用QT6和VS2019编译KArchive的简要步骤&#xff1a; 安装 Qt &#xff0c;我是用源码自己编译的 "F:\qtbuild"安装CMakefile并配置环境变量安装Git下载ECM源码 https://github.com/KDE/extra-cmake-modules.git-------------------------------------------------…

springboot docker

在Spring Boot中使用Docker可以帮助你将应用程序与其依赖的容器化&#xff0c;并简化部署和管理过程。 当你在Spring Boot中使用Docker时&#xff0c;你的代码不需要特殊的更改。你可以按照通常的方式编写Spring Boot应用程序。 java示例代码&#xff0c;展示了如何编写一个基…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

电脑突然提示msvcr120.dll错误的解决方法,最全面的解决方法

今天&#xff0c;我将和大家分享一种常见的电脑问题——电脑突然提示msvcr120.dll错误的解决方法。希望通过这次演讲&#xff0c;能够帮助大家解决这个问题&#xff0c;提高大家的电脑使用效率。首先&#xff0c;让我们来了解一下msvcr120.dll是什么。msvcr120.dll是Microsoft …

CMH检验

前言 CMH检验&#xff08;Cochran-Mantel-Haenszel Test&#xff09;&#xff0c;分层卡方检验&#xff0c;考虑中心效应&#xff0c;分析干预对结果的影响。如果存在中心效应&#xff0c;即干预结果与中心相关&#xff0c;那么简单的将中心数据合并做卡方分析并不合理。需要采…

记事本编辑代码出错?编程初学者为什么不要用系统文本编辑器? 文本编辑器踩坑指南,代码格式化无效,写代码必看

题目: 写一段判断 2 到 10 之间的质数的输出 环境 左: VScode 右: Windows 文本编辑器(记事本) 目录 代码展示 原视频介绍 图文介绍 更离谱的是使用vscode 一键格式化 摆烂??? 最终手动缩进才解决问题 解决问题 那么问题究竟出在哪里? 文本比较即可 还是不够直…

“媒体+”时代正当时,ATEN以前瞻解决方案助推媒体融合纵深发展

自媒体融合概念提出以来,传统媒体与新媒体融合速度加快,两者的相互结合与优势互补为广电行业发展提供了新的契机,更加多元化、个性化、强互动的“媒体”传播格局已逐渐形成。 “媒体”理念的创建,对于广电行业而言无疑是一种积极的改革创新之举,然而“媒体”的发展也呈现出泛媒…

Redis与Mysql区别

一、关系型数据库 mysql&#xff0c;pgsql,oracle ,sqlserver 支持连表关联查询&#xff08;会有一些特定的语法特特性&#xff09; 二、非关系型数据库 redis,mongodb,memcache &#xff08;key-value&#xff09; 三、关系型数据库与非关系型数据库的区别&#xff1a; 1&am…

idea 显示内存占用,分配内存实时内存

1、打开项目 2、双击“shift” 3、输入show memory indicator 4、打开开关&#xff0c;搞定&#xff01; 5、效果

【git】Idea撤回本地分支、或远程分支提交记录的各种实际场景操作步骤

文章目录 idea撤回本地分支、远程分支场景操作集合场景1&#xff1a;要撤回最后一次本地分支的提交实现效果&#xff1a;操作步骤&#xff1a; 场景2&#xff1a;要撤回最后一次远程分支的提交有撤销记录的&#xff1a;实现效果&#xff1a;操作步骤&#xff1a; 无撤销记录的&…

MySQL内容及原理记录

原理篇 架构、索引、事务、锁、日志、性能调优 高可用 读写分离、分库分表、分布式ID、高可用、分布式数据库、分布式事务、分布式锁 架构 1 执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; &#xff08;1&#xff09;连接器&#xff1a;客户端通过连接器…

Java five 分析String、Character、Scanner、Number 和 Math 类使用方法

目录 Java String 类使用方法1. 连接字符串2. String 方法3. Java StringBuffer 和 StringBuilder 类 Java Character 类Character 方法使用 Java Scanner 类Java Number & Math 类1. Number 类2. Math 类3. Number & Math 类方法 Java String 类使用方法 String 类是不…

idea配置默认javadoc类、接口注释,自动生成文档

idea配置 类 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java") /*** 总体描述* <p>创建时间&#xff1a;${DATE} ${TIME}</p>* author zhaoXin* since v1.0*/ public class $…