java 面向对象高级

1.final关键字

在这里插入图片描述

class Demo{
    public static void main(String[] args) {
        final int[] a=new int[]{1,2,3};
       // a=new int[]{4,5,6};  报错
        a[0]=5;//可以,解释了final修饰引用性变量,变量存储的地址不能被改变,但地址所指向的对象的内容可以改变
    }
}

什么是常量?
在这里插入图片描述

2.单例设计模式-懒汉式单例-饿汉式单例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.枚举类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//常规写法
class Constant{
    public static final int UP=0;
    public static final int DOWN=1;
    public static final int LEFT=2;
    public static final int RIGHT=3;
}
class Demo{
    public static void move(int direction){
        switch (direction){
            case Constant.UP:
                System.out.println("向上移动");
                break;
            case Constant.DOWN:
                System.out.println("向下移动");
                break;
            case Constant.LEFT:
                System.out.println("向左移动");
                break;
            case Constant.RIGHT:
                System.out.println("向右移动");
                break;
            default:
                System.out.println("无效方向");
        }
    }
}
//枚举类写法,相较于常规的好处是
/*类型安全:枚举提供了更好的类型安全,因为它们限制了变量只能取预定义的值,而常规的静态常量类则没有这种限制。
可读性:枚举通常更易于阅读和理解,因为它们使用名称而不是数字或字符串来表示常量值。
维护性:使用枚举可以更容易地管理和维护一组相关的常量值,因为它们是集中定义的。
功能扩展:枚举可以有自己的方法和属性,这为扩展功能提供了可能,而常规的静态常量类则没有这样的能力。*/
enum Direction{
    UP,DOWN,LEFT,RIGHT
}
class Demo2{
    public static void move(Direction direction){
        switch (direction){
            case UP:
                System.out.println("向上移动");
                break;
            case DOWN:
                System.out.println("向下移动");
                break;
            case LEFT:
                System.out.println("向左移动");
                break;
            case RIGHT:
                System.out.println("向右移动");
                break;
        }
    }
}

4.认识抽象类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.模板方法设计模式

在这里插入图片描述
在这里插入图片描述

class A extends fu{
    public void writemain(){
        System.out.println("特殊方法A");
    }
}
class B extends fu{
    public void writemain(){
        System.out.println("特殊方法B");
    }
}
abstract class fu{
    public final void write(){
        System.out.println("公用方法1");
        writemain();
        System.out.println("公用方法2");
    }
    public abstract void writemain();
}
class Demo{
    public static void main(String[] args) {
        fu a=new A();
        a.write();
    }
}
/*
输出:
公用方法1
特殊方法A
公用方法2
 */

在这里插入图片描述

6.认识接口

在这里插入图片描述

在这里插入图片描述

//jdk 8之前,接口中只能定义常量和抽象方法
//接口不能创建对象
public interface A {
    String STUDENT_NAME="li hua"; //接口中默认加上 public static final
    // 等价于 public static final String STUDENT_NAME="li hua";
    void run();//接口中给方法默认加上public abstract
    //等价于 public abstract void run();
}


//Demo被称为实现类,可以同时实现多个接口,
//实现类实现多个接口必须重写全部抽象方法,否则必须定义成抽象类
public class Demo implements A{
    @Override
    public void run() {
    }
}

在这里插入图片描述

public class Demo{
    public static void main(String[] args) {
        people p=new student();
        doctor d=new student();
        driver dr=new student();
    }
}
interface driver{}
interface doctor{}
class student extends people implements driver,doctor{}
class people{}

接口的应用案例
在这里插入图片描述

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

public class Demo{
    public static void main(String[] args) {
        student[] s=new student[3];
        s[0]=new student("li hua","boy",90);
        s[1]=new student("zhang san","boy",100);
        s[2]=new student("tu xin yue","girl",95);
        tool t=new imp2(s);
        t.listallinfo();
        t.sumscore();
    }
}

class student{
    private String name;
    private String sex;
    private double score;

    public student(String name, String sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }
    public student(){}
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
interface tool{
    public void listallinfo();
    public void sumscore();
}
class imp1 implements tool{
    private student[] s;
    public imp1(student[] s){
        this.s=s;
    }
    @Override
    public void listallinfo() {
        for(int i=0;i<s.length;i++){
            System.out.println(s[i].getName()+" "+s[i].getSex()+" "+s[i].getScore());
        }
    }

    @Override
    public void sumscore() {
        double sum=0;
        for(int i=0;i<s.length;i++){
            sum+=s[i].getScore();
        }
        System.out.println(sum/s.length);
    }
}
class imp2 implements tool{
    private student[] s;
    public imp2(student[] s){
        this.s=s;
    }
    @Override
    public void listallinfo() {
        int flag=0;
        for(int i=0;i<s.length;i++){
            System.out.println(s[i].getName()+" "+s[i].getSex()+" "+s[i].getScore());
            if(s[i].getSex()=="boy"){
                flag++;
            }
        }
        System.out.println("男生人数:"+flag+"女生人数:"+(s.length-flag));
    }

    @Override
    public void sumscore() {
        double max=s[0].getScore();
        double min=s[0].getScore();
        double sum=0;
        for(int i=0;i<s.length;i++){
            sum+=s[i].getScore();
            if(max<s[i].getScore()){
                max=s[i].getScore();
            }
            if(min>s[i].getScore()){
                min=s[i].getScore();
            }
        }
        System.out.println("去掉一个最高分和最低分后的平均分为"+(sum-max-min)/(s.length-2));
    }
}

7.JDK8开始,接口新增的三种方法

在这里插入图片描述

public class Demo{
    public static void main(String[] args) {
        A a=new impA();
        a.run();
        A.show();
    }
}
class impA implements A{}
interface A{
    //1.大部分情况下,接口只能写抽象方法,jdk8之后,可以写普通实例方法了,但必须加default修饰
    //默认用public修饰
    //但是接口不能构建对象,应该怎么调用该方法?利用接口的实现类的对象来调用
    default void run(){
        System.out.println("--run--");
        go();
    }
    //2.jdk9开始支持私有方法,他是私有的,利用接口的实现类的对象也不能调用了,只能使用接口中的其他实例方法来调用
    private void go(){
        System.out.println("--go--");
    }
    //3.静态方法,默认用public方法,如何调用?只能通过接口名字直接调用
    static void show(){
        System.out.println("--show--");
    }
}

8.接口的注意事项

在这里插入图片描述

//
public class Demo{
    public static void main(String[] args) {
        
    }
}
class D implements C{
    @Override
    public void show3() {}
    @Override
    public void show1() {}
    @Override
    public void show2() {}
}
interface A{
    void show1();
}
interface B{
    void show2();
}
interface C extends A,B{
    void show3();
}

9.抽象类和接口的区别

相同点:
1.都是抽象形式,都可以抽象方法,都不能创建对象
2.都是派生子类形式,抽象类是被子类继承使用,接口是被实现类实现
3.一个类继承抽象类,或者实现接口,都必须重写玩他们的抽象方法,否则自己要成为抽象类不然会报错
4.都能支持多态,都能实现解耦合
不同点:
1.抽象类可以定义类的全部普通成员,接口只能定义常量和抽象方法(以及JDK8以后的三种新方法)
2.抽象类只能被类单继承,接口可以被类多实现
3.一个类继承抽象类就不能再继承其它类,一个类实现了接口还可以继承其他类或实现其他接口
4.抽象类体现模板思想,更利于做父类,实现代码的复用性
5.接口更适合做功能的解耦合,解耦合性更强更灵活。
6.设计目的
抽象类
主要用于代码复用和提供一个通用的模板。它体现了一种 “is - a” 的关系,即子类是一种特殊的抽象类。例如,Dog是一种Animal,Dog类可以继承Animal抽象类,复用Animal类中的属性和方法,同时实现自己特有的行为(如makeSound()方法实现狗叫)。
接口
用于定义行为规范,实现接口的类必须遵循这个规范。它体现了一种 “can - do” 的关系,即类可以做接口定义的事情。例如,如果一个类实现了Flyable接口,就表示这个类可以飞行,不管这个类是Bird还是Airplane,只要实现了Flyable接口,就必须实现fly()方法来定义飞行的行为。

10.一个案例

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

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

相关文章

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

echarts引入自定义字体不起作用问题记录

echarts引入自定义字体不起作用问题记录 1、问题描述 初始化界面字体不作用&#xff0c;当界面更新后字体样式正常显示 2、原因描述 这通常是由于字体文件加载延迟导致的。ECharts 在初始化时可能还没有加载完字体文件&#xff0c;因此无法正确应用字体样式 3、解决方案 …

AscendC从入门到精通系列(一)初步感知AscendC

1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者…

JavaScript——函数、事件与BOM对象

一、系统函数(JS中预置的函数) JS的预置函数在遇到非数字字符时会停止解析 parseInt 转整型 parseFloat 转浮点型 isNaN !isNaN("10") 检测是否纯数字 eval 把字符串转成算式并计算 1.parseInt(string, radix); 语法&#xff1a; string&#x…

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违&#xff0c;请相信&#xff0c;上天自有安排&#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程 进程&#xff1a;就…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换&#xff08;warp&#xff09;。 该函数根据 ECC 标准 ([78]) 估计最优变换&#xff08;warpMatri…

彻底解决单片机BootLoader升级程序失败问题

文章目录 1、引言2、MicroBoot&#xff1a;优雅的解决升级问题问题1&#xff1a;bootloader 在跳转到app前没有清理干净存在的痕迹问题2&#xff1a; 需要 APP 传递信息给 Bootloader问题3&#xff1a; APP单独运行没有问题&#xff0c;通过Bootloader跳转到APP运行莫名死机问题…

v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条

效果 导入组件 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; components:{ ElImageViewer },模板使用组件 <el-image-viewerv-if"isShowPics":on-close"closeViewer":url-list"srcList"/>定义两…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库&#xff0c;吹嘘自己比 NUnit 和 xUnit 还要高明&#xff0c; 支持在 TEST_CASE() 中的多个 SECTION&#xff0c; 意思是说 SECTION 外头的代码相当于setup 和 teardown&#xff0c;section 内部则被认为是实际的 test case&#xff0c; 这种写法可…

深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅

​​​​​​​ &#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承基类成员访问⽅式的变化 继承类模板 基类和派⽣类间的转换 继承中的作⽤域 隐藏规则 成员函数的隐藏 考察继承【作⽤…

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库&#xff0c;可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串&#xff0c;整型&#xff0c;浮点型等&#xff0c;且键是唯一的 4.键值对中…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)

1. 问题现象 环境&#xff1a; 系统&#xff1a;win11node&#xff1a;v16.20.2“vue”: “2.6.10” 执行npm run serve启动vue项目&#xff0c;期望&#xff1a; App running at:- Local: http://localhost:9528/ - Network: http://x.x.x.x:9528/实际&#xff1a; App runn…

喜报|超维机器人荣获昇腾AI创新大赛铜奖

近日&#xff0c;在备受瞩目的昇腾AI创新大赛中&#xff0c;超维机器人凭借扎实的技术实力和创新产品&#xff0c;荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破&#xff0c;也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…

编程初学者的第一个 Rust 系统

编程初学者的第一个 Rust 系统 对编程初学者而言&#xff0c;存在一个 “第一个系统” 的问题&#xff0c;如果没有学会第一个系统&#xff0c;编程初学者是学不会编程的。原因是&#xff0c;现实生活里的应用程序都是有一定体量的&#xff0c;不是几十行&#xff0c;几百行的…

单元测试、集成测试、系统测试有什么区别

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中&#xff0c;单元测试粒度最小&#xff0c;系统du测试粒度最大。 2、测试方式不同…

Java面试要点16 - 面向对象基础:类与对象

本文目录 一、引言二、类的定义与对象创建三、成员变量与封装四、构造方法五、this关键字六、静态成员七、总结 一、引言 面向对象编程是Java的核心特性之一&#xff0c;它通过类和对象的概念来组织和管理代码&#xff0c;使代码更加模块化、可复用和易于维护。本文将深入探讨…

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用&#xff0c;简化繁琐的抓包流程。 一键生成去更新IPA&#xff08;手机安装后&#xff0c;去除App Store的更新检测&#xff09;。 软件界面 支持系统 Windows 10/Windows 8/Windows 7&#xff08;由于使用了Fiddler库&#xff0c;因此需要.Net环境…

LeetCode 热题100 之 多维动态规划

1.不同路径 思路分析&#xff1a;动规五部曲 dp数组定义&#xff1a;dp[i][j]表示从起点&#xff08;0&#xff0c;0&#xff09;到位置(i,j)的路径数量递推公式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 从 (i-1, j) 位置到 (i, j) 需要走一步向下的路径。从 (i, j-1) 位…

文件操作(3)

前言&#xff0c;在上篇博客介绍了如何正确的打开一个文件和关闭一个文件&#xff0c;今天我们来学习如何在文件中输出和输入数据。 对文件数据的读写可以分为顺序读写和随机读写。顺序读写&#xff0c;即挨着顺序对文件中的数据进行输入或输出。 在这片博客中&#xff0c;我们…