面向对象设计(下)《Ⅱ》

news2024/11/27 5:59:36

文章目录

  • 抽象类
    • 抽象类的理解(抽象类不能实例化)
  • 设计模式
    • 模板方法设计模式
    • 代理模式
    • 工厂方法设计模式
  • 接口
    • 接口的定义(接口仅可以用public修饰)
    • 接口的实现
    • jdk1.8中接口的默认方法和静态方法
  • 内部类
    • 成员内部类
      • 静态成员内部类的创建
      • 非静态成员内部类的创建
      • 内部类可以运用其类中的属性
    • 局部内部类
      • 有名局部内部类
      • 匿名局部内部类
      • 注意
  • 枚举类
    • 自定义枚举类
    • enum创建枚举类
    • 枚举类实现接口
  • 注解
    • java内置的注解
    • 自定义注解(和类是同级关系)
    • 元注解(描述注解的注解)

抽象类

抽象类可以不包含抽象方法

抽象类的理解(抽象类不能实例化)

①为什么使用抽象类:
某种情况下,我们只知道父类的子类有一些方法,但是不知道子类的方法具体怎么实现的
这时,Java允许父类只提供一个方法的声明,而不提供具体的实现
提供的方法声明为抽象方法;含有一个或者多个抽象方法的类称之为抽象类
②抽象类的声明
访问控制修饰符(public private) abstract class 类名{}
③抽象方法的声明
访问控制修饰符 abstract 返回类型 方法名(参数列表); 注意,没有{}因为其没有具体实现的代码块,所以 以 ; 结尾 即可
④抽象类中可以有构造器:作用:子类继承父类所有属性,需要知道父类的属性是如何初始化的
⑤子类继承父类时,如果重写的父类所有的抽象方法,那么该类就为具体类,子类就可以实例化
如果子类没有重写父类中所有的抽象方法,那么该子类仍为抽象类

public class abstructClass {
    public static void main(String[] args) {
        Chinese c1=new Chinese(18,"中国","坚强");
        c1.show();
    }
}
abstract class person{
    private int age;
    private String nation;

    public person() {
    }

    public person(int age, String nation) {
        this.age = age;
        this.nation = nation;
    }
    public abstract void show();
}
class Chinese extends person{
    private String spirit;

    public Chinese() {
    }

    public Chinese(int age, String nation, String spirit) {
        super(age, nation);
        this.spirit = spirit;
    }
    public void show(){
        System.out.println("中国人的精神为"+this.spirit);//对方法进行了重写,所以其类为具体类,可以实例化了
    }
    
}
abstract class American extends person{
    private String nation;

    public American() {
    }

    public American(int age, String nation, String nation1) {
        super(age, nation);
        this.nation = nation1;
    }
    public abstract void show();//这里没有对方法进行重写,所以其还为抽象类
}

设计模式

模板方法设计模式

抽象类体现的就是一种模板设计模式,父类作为子类的模板
解决的问题:当解决的问题一部分是确定的,一部分是不确定的,这时就可以把不确定的方法暴露出去,交给子类去实现 ; 编写一个抽象父类,父类中写一个或者多个通用方法,交给子类去实现,就是一种设计模式

代理模式

所谓代理模式就是两个类实现同一个方法,其中一个A类作为属性存于B类中,B
类就作为A类的代理类,其构造器中创建A类对象,抽象方法的实现里采用A类方法对于接口方法的实现
下面举例:A类方法

public class specifyboss implements boss{
    @Override
    public void consume() {
        System.out.println("秘书的老板消费");
    }

    @Override
    public void meet() {
        System.out.println("秘书的老板见面");
    }
}

B类方法

public class specifybosspoxey implements boss{
   private specifyboss smallboss;//秘书为老板服务,所以属性中由老板

    public specifybosspoxey() {
        smallboss=new specifyboss();//调用秘书是为了联系老板,所以构造器中创建老板对象;
    }

    @Override
    public void consume() {
        smallboss.consume();//秘书也实现接口,但是实现抽象方法时用自己老板中写的方法;
    }

    @Override
    public void meet() {
        smallboss.meet();
    }
}

最终的测试:在这里插入图片描述

工厂方法设计模式

接口

优点:解决了Java中的单继承的局限性,可以定义多个不相关事物的相同功能

接口的定义(接口仅可以用public修饰)

①接口和类是平级的,即定义时为 访问控制修饰符(public private) interface 接口名
②接口可以理解为特殊的抽象类 其内只可以有 全局静态常量抽象方法,即只可以包含
public static final 数据类型 数据名=初始值 (系统默认会加上static final)
public abstract 返回值类型 方法名(参数列表);
(系统默认加上abstract)
③接口中不可以有 变量 代码块 构造器
③接口不可以被创建,只可以被实现

接口的实现

①实现接口的类为“实现类”,实现类的功能和“继承是相同的”,实现类可以实现接口中的所有抽象方法
②实现类实现了接口中的所有抽象方法,其就为具体类,可以创建对象实例化,否则不可以实例化
③接口可以多个实现,即一个实现类可以实现多个接口
④接口不能继承任何类,但是接口可以继承接口,并且可以多继承接口、
⑤一个类可以继承另一个类,同时实现多个接口
(先继承后实现)
⑥接口也支持多态,即接口引用指向实现类对象

public class interfaceTest {
    public static void main(String[] args) {
        System.out.println(Flyer.number);//验证number为静态常量 以及number为final类型,不可以被修改
        birds b1=new birds();
        b1.shoutime();
        b1.show();
        b1.talent();
    }
}
interface Flyer{
    public static final int number=100;
    public abstract void shoutime();
}
interface Runner{
    public  abstract void show();
}
class Animal{
    public void talent(){
        System.out.println("吃饭");
    }
}
class birds extends Animal implements Flyer,Runner{//一个类可以实现多个接口
    @Override
    public void shoutime() {
        System.out.println("鸟儿会飞");
    }
    public void show(){
        System.out.println("鸟儿可以跑");
    }
}
class plane implements Flyer{
    @Override
    public void shoutime() {
        System.out.println("飞机也会飞");
    }
}

jdk1.8中接口的默认方法和静态方法

Ⅰ jdk1.8中的接口中可以声明默认方法
①默认“类优先”,当类中继承的父类和实现接口的默认方法同名时,默认“类优先”,即执行继承父类中的方法
②当实现多个接口的默认方法时,实现类中要声明出来具体实现哪个接口的方法—具体步骤:接口名.super.默认方法名
Ⅱ jdk1.8中的接口可以声明静态方法

public class interface_jdk{
    public static void main(String[] args) {
        myinterface my=new myinterface();
        my.show();
        jdkinterface.add();
    }

}
//jdk1.8中的接口中可以声明默认方法
//①默认“类优先”,当类中继承的父类和实现接口的默认方法同名时,默认“类优先”,即执行继承父类中的方法
//②当实现多个接口的默认方法时,实现类中要声明出来具体实现哪个接口的方法----具体步骤:接口名.super.默认方法名
//jdk1.8中的接口可以声明静态方法
interface jdkinterface{
    default void show(){
        System.out.println("这是接口中的默认方法的声明");
    }
    public static void add(){
        System.out.println(10+20);
    }
}
class superinterface{
    public void show(){
        System.out.println("这是父类中的方法");
    }
}
class myinterface extends superinterface implements jdkinterface{
    @Override
    public void show() {
        super.show();
    }
}

内部类

成员内部类

静态成员内部类的创建

格式:创建内部静态类的格式 类.静态内部类 引用名=new 类.静态内部类

 //创建静态内部类对象
      parent.children ch=new parent.children();//这是一个创建内部静态类的格式 类.静态内部类 引用名=new 类.静态内部类
      ch.setName("李华");
      ch.setAge(18);
      ch.setHobby("basketball");
        System.out.println(ch.toString());

非静态成员内部类的创建

格式:类.非静态内部类 引用名=类引用.new 非静态内部类

//创建非静态内部类的对象
        parent p=new parent();
        parent.dog d=p.new dog();//这是一个语法格式,记住即可 类.非静态内部类 引用名=类引用.new 非静态内部类

内部类可以运用其类中的属性

class parent{
    private String name="小王";
    private int age;
    private String owner="my";
    public class dog{
        private String name="白白";
        private int age;
        public void setName(String name) {
            System.out.println("内部类可以运用外部类的属性"+owner);
            System.out.println("局部变量中的name:"+name);
            System.out.println("内部类中的name:"+this.name);
            System.out.println("外部类中的name"+parent.this.name);
            this.name = name;
        }

测试如下:在这里插入图片描述

局部内部类

局部内部类就是在一个类的方法中创建另一个类

有名局部内部类

这里的Comparator是jdk自带的一个接口

 public Comparator getComparator(){
        //局部内部类
        class childern implements Comparator{
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
            public void show(){
                System.out.println("这是局部内部类的方法");
            }
        }
        Comparator ch1=new childern();
        return ch1;
    }

匿名局部内部类

这里的从–>到<–里的部分是实现接口的内部类,但是没有名字,直接new了

public Comparator getComparator2(){
        Comparator cm1=new Comparator() A---->{
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
            public void show2(){
                System.out.println("这是匿名内部类的方法");
            }
        };<----
        //这里的大括号里就是内部类,实现了Comparator这个接口,但是这个内部类没有名字 注意:这里大括号后有个“;”
        return cm1;
    }

注意

局部内部类使用同级别的属性时,其内部类中的同级别属性为final类型,不可以进行修改

枚举类

自定义枚举类

构造器私有化 类的内部创建枚举类
注意这里的枚举类定义为static final

private String description;
        private String month;

        public static final season Spring=new season("春天百花开","2-4");
        public static final season Summer=new season("夏天蝉鸣叫","5-7");
        public static final season Autumn=new season("秋天枫叶红","8-10");
        public static final season Winter=new season("冬天白雪飘","11-1");
        private season(String description, String month) {
            this.description = description;
            this.month = month;
        }

        @Override
        public String toString() {
            return "sesaon{" +
                    "description='" + description + '\'' +
                    ", month='" + month + '\'' +
                    '}';
        }

enum创建枚举类

使用enum创建枚举类时枚举类方法最上面,且直接枚举类名字实现构造器即可,每个枚举类之间逗号隔开,知道最后句号结尾

Spring("春天百花开","2-4"),
    Summer("夏天蝉鸣叫","5-7"),
    Autumn("秋天枫叶红","8-10"),
    Winter("冬天白雪飘","11-1");

枚举类实现接口

public enum season2 implements myinterfacce {//


    Spring{
        @Override
        public void show() {
            System.out.println("这是春天");
        }
    },
    Summer{
        @Override
        public void show() {
            System.out.println("这是夏天");
        }
    },
    Autumn{
        @Override
        public void show() {
            System.out.println("这是秋天");
        }
    },
    Winter{
        @Override
        public void show() {
            System.out.println("这是冬天");
        }
    };

}

注解

java内置的注解

①@Override 用于注解重写方法 其下面的方法必须为重写方法
②@Deprecated 用于注解类、属性、方法 说明其已经过时,不建议使用
③@SuppressWarings 用于抑制编译器警告

自定义注解(和类是同级关系)

public @interface 注解名

元注解(描述注解的注解)

①@Rention 用于说明注解的生命周期
②@Target 用于说明注解可以修饰哪些程序元素
③@Document 用于说明注解可以自动生成说明文档 注意:此时的生命周期必须是@Rention(RUNTIME)
④@Inherited 用于说明注解有继承性

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

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

相关文章

力扣10.正则表达式匹配

前言&#xff1a; 由于今天面试前端&#xff0c;面试官问对正则表达式的匹配理解吗&#xff1f; 当时脑袋发热&#xff0c;我说就是对字符串的替换。。。。 太抽象了&#xff0c;于是我面试结束后马上打开力扣&#xff0c;解了正则表达式的匹配算法题(四种语言)&#xff1b; 下…

Lombok注解详解

文章目录 注解详解lombok包下注解汇总- Getter- Setter- ToString- EqualsAndHashCode- Data- Value- NonNull- NoArgsConstructor- AllArgsConstructor- RequiredArgsConstructor- Builder- Synchronized- Cleanup- Singular- Generated- SneakyThrows- val- var experimental…

【数据结构】心里有 “B树“ 么?

序言 在学习数据库之前&#xff0c;博主觉得有必要学习B树系列&#xff0c;以便之后更好地了解其原理&#xff0c;既然说到这里了&#xff0c;那就再说几句&#xff0c;数据库是帮助我们管理存在硬件当中的数据&#xff0c;如果要从中读取数据&#xff0c;就要考虑到硬件的读取…

[JNI]使用jni实现简单的Java调用本地C语言代码

[JNI]使用jni实现简单的Java调用本地C语言代码 JNI的解释 Java Native Interface&#xff0c;即Java本地接口。 在Java官方描述中为&#xff1a; The JNI is a native programming interface. It allows Java code that runs inside a Java Virtual Machine (VM) to interope…

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求

目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一&#xff1a;某智慧旅游城市建设项目 案例二&#xff1a;某景区智慧化改造项目…

命令重装Linux系统,无需登录控制面板

命令重装Linux系统&#xff0c;无需登录控制面板 部分无法登录控制面板使用这个脚本 自动安装安装脚本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安装命令参考 # 自动安装 Debian 10 buster …

二叉搜索数使用,底层原理及代码实现

1:二叉搜索树的定义 二叉搜索树的底层是一个二叉链表 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所…

kilimall非洲电商培训,基础版+进阶版+高阶版 从0-1个人可入驻的平台(12节)

亲爱的朋友们&#xff0c;你们知道吗&#xff1f;有一个神奇的电商平台——kilimall&#xff0c;它可以帮助你实现创业梦想&#xff0c;让你走上财富之路&#xff01; 首先&#xff0c;让我给大家介绍kilimall的基础版。基础版针对的是0经验的小白&#xff0c;提供了详细的教程…

vscode打开esp-idf工程,找不到头文件,有波浪线

就像这样 多半是因为原始的工程不是用vscode的插件新建的&#xff0c;因此没有相关的路径。需要在工程文件夹下的.vscode文件夹中的c_cpp_properties.json文件中增加路径&#xff0c;可以参考插件自动新建的工程里面的写法 {"configurations": [{"name":…

TeXlive TeXstudio安装指南

TeXlive & TeXstudio安装指南 记上次安装Visual Studio Code (Vscode)配置LaTeX后&#xff0c;由于Overleaf页数太多&#xff0c;项目超过了免费计划的编译时限&#xff08;这两天突然出现这个问题&#xff09;。加上毕设和PPT都是在Overleaf上编译&#xff0c;这两天突然…

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

electron进程间通信

Electron 应用程序的结构非常相似。 作为应用开发者&#xff0c;你将控制两种类型的进程&#xff1a;主进程 和 渲染器进程。 这类似于上文所述的 Chrome 的浏览器和渲染器进程。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用程序的入口点。 主进程在 N…

STM32快速入门(总线协议之I2C一主多从(软件实现 硬件实现))

STM32快速入门&#xff08;总线协议之I2C一主多从&#xff08;软件实现 & 硬件实现&#xff09;&#xff09; 前言 支持一对多&#xff08;一主多从&#xff09;、多对多传输&#xff08;多主多从&#xff09;&#xff0c;只支持半双工&#xff0c;一般有两根数据线&…

蓝桥之链表

最近真的特别焦虑&#xff0c;体测、比赛和考试一个接一个&#xff0c;让人喘不过气来QAQ 甚至考试和比赛还有冲突&#xff0c;sad 最近因为看了牙&#xff0c;打了药的缘故&#xff0c;一直在吃素QAQ 本来今天还想写个知识点总结的&#xff0c;但是太晚了&#xff0c;现在已…

吃透前端文件上传与文件相关操作

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">选择文件</input>如果我们想限制上传文件的格式,大小或进行裁剪分片上传…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

树莓派4B-搭建一个本地车牌识别服务器

实现目标&#xff1a; 一、设备自启后能够获得服务的ip与端口号&#xff0c;用于计算机连接设备&#xff1b; 二、计算机可以通过服务ip与端口访问设备服务&#xff1b; 三、上传需要处理的数据&#xff0c;返回结果反馈给用户&#xff1b; 四、上传到服务器的数据不会导致设备…

Study--Oracle-02-单实例部署Oracle19C

一、CentOS 7 环境准备 1、软件准备 操作系统&#xff1a;CentOS 7 数据库版本: Oracle19C 2、操作系统环境配置 关闭selinux &#xff0c;编辑 /etc/selinux/config文件&#xff0c;设置SELINUX enforcing 为SELINUXdisabled [rootoracle ~]# grep SELINUX /etc/seli…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

HTML表单创建学习

文章目录 1、创建HTML框架2.body标签CSS3.表单创建3.1、添加fieldset与label标签3.2、为label标签添加css样式3.3、添加input标签3.4、添加提交按钮3.5、在input标签中添加required3.6、添加minlength属性3.7、pattern属性3.8、设置表单单选按钮无法同时选中3.9、添加链接3.10、…