(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类

news2025/5/17 18:48:13

目录

1. Object类

 1.1 equals

1.2 toString()

2.final关键字

3.注解

4. 设计模式

 4.1 单例模式

4.1.1 饿汉式

4.1.3 饿汉式 VS 懒汉式

5. 抽象类&抽象方法

6. 接口

7.内部类 

7.1 成员内部类

7.2 静态内部类

7.3 方法内部类

7.4 匿名内部类


1. Object类

 1.1 equals

重写Object 的equals方法,两种实现方式

 

1.2 toString()

 

2.final关键字

 

 

3.注解

4. 设计模式

设计模式是基于场景的解决方案

 4.1 单例模式

 

4.1.1 饿汉式

代码实现:

package org.example;

/**
 *   01   饿汉式 : 创建对象实例的时候直接初始化
 *
 *   典型的空间换时间,类加载的的时候  ==>静态实例对象完成初始化操作
 */
public class SingletonOne {
    // 1. 创建类中的私有构造
    private SingletonOne(){
    }

    // 2. 创建改类型的私有静态实例   (创建并实例化)
    private static SingletonOne instance = new SingletonOne();

    // 3. 创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance(){
        return instance;
    }
}

测试结果:

import org.example.SingletonOne;

public class test {
    public static void main(String[] args) {
//        SingletonOne one = new SingletonOne();
        SingletonOne one = SingletonOne.getInstance();
        SingletonOne two = SingletonOne.getInstance();
        System.out.println(one);  //org.example.SingletonOne@4554617c
        System.out.println(two);  //org.example.SingletonOne@4554617c
        System.out.println(one == two);      //true
        System.out.println(one.equals(two));   //true
    }
}

4.1.2 懒汉式

package org.example;

/**
 * 02 懒汉式
 *
 * 类内实例对象创建时并不初始化,直到第一次调用get方法时,才完成初始化操作
 * 用时间换取空间的一种编码模式
 */
public class SingletonTwo {
    // 01 创建私有构造方法
    private SingletonTwo(){
    }

    // 02 创建开放的静态方法提供实例对象
    public static SingletonTwo instance = null;

    // 03. 创建开放的实例方法提供实例对象
    public static SingletonTwo getInstance(){
        if(instance == null){
            instance = new SingletonTwo();
        }
        return instance;
    }
}

测试

import org.example.SingletonOne;
import org.example.SingletonTwo;

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

        System.out.println("=====================");
        SingletonTwo one1 = SingletonTwo.getInstance();
        SingletonTwo two1 = SingletonTwo.getInstance();
        System.out.println(one1);   //org.example.SingletonTwo@74a14482
        System.out.println(two1);   //org.example.SingletonTwo@74a14482
        System.out.println(one1 == two1);  //true
    }
}
4.1.3 饿汉式 VS 懒汉式

5. 抽象类&抽象方法

/**
 * 抽象类: 这个类不允许被实例化了,可以通过向上转型,转向子类实例
 */
public abstract class Animal {
//    public void eat(){
//        System.out.println("动物都需要吃东西");
//    }

    // 抽象方法没有方法体
    // 子类继承父类也必须重写父类的抽象方法,否则也需要将子类定义为抽象类
    // static、final、private   不能与abstract并存
    public abstract void eat();
}

6. 接口

定义接口

public interface INet {
    /**
     * 接口中抽象方法可以不写abstract关键字
     *
     * 默认访问修饰符 public
     *
     * ==> 当类实现接口时,需要实现接口中的所有抽象方法,否则需要将该类设置为抽象类
     */
    void network();
    // 接口中可以包含常量, 默认public、 static、 final

    int TEMP = 20;

    // default:默认方法 可以带方法体         jdk1.8后新增的
    // 可以在实现类中重写,并可以通过接口的引用调用
    default void connection(){
        System.out.println("我是接口中的默认链接");
    }

    //静态方法也可以待方法体                 jdk1.8后新增的
    // 不可以在实现类中重写, 可以通过接口名调用
    static void stop(){
        System.out.println("我是接口中的静态方法");
    }
}

实现接口

package com.vb.tel;

public class SmartPhoto implements INet{
//    public static final int TEMP = 30;
    public int TEMP = 30;

    public void call(){
        System.out.println("Calling SmartPhoto");
    }

    public void network(){
        System.out.println("Networking SmartPhoto");
    }
    @Override
    public void connection() {
        //调用接口中的默认方法
        INet.super.connection();
        System.out.println("Connection SmartPhoto");
    }
}

测试类

public class PhoneTest {
    public static void main(String[] args) {
        FourthPhone phone4 = new FourthPhone();
        phone4.game();            //可以玩游戏
        phone4.getBrand();
        phone4.call();            //手机可以拨打电话
        System.out.println("================");
        IPhoto ip = new FourthPhone();
        ip.photo();                     //拍照
        ip = new Camera();
        ip.photo();                   //相机可以拍照
        System.out.println("================");
        System.out.println(INet.TEMP);   //20
        INet net = new SmartPhoto();
        System.out.println(net.TEMP);    //20
        net.connection();
        //我是接口中的默认链接
        //Connection SmartPhoto
        // 接口中的静态方法需要通过接口名来调用
        INet.stop();               //我是接口中的静态方法
    }
}

7.内部类 

7.1 成员内部类

        内部类中最常见的,也称为普通内部类

内部类

package com.vb.people;

// 外部类
public class Person {
    public int age;

    public void eat(){
        System.out.println("People eat");
    }
    // 获取内部类的方法
    public Heart getHeart(){
        new Heart().temp = 25;
        return new Heart();
    }

    //成员内部类

    /**
     * 1. 内部类在外部使用时,无法直接实例化
     * 选哟借助外部类信息才能完成实例化
     * 2. 内部类可以直接方法外部类的成员;如果出现同名属性,优先访问内部类中定义的
     * 3. 可以通过使用外部类.this.成员的方式,访问外部类中同名的信息
     * 4. 外部类访问内部类的信息,需要通过内部类实例,无法直接方问
     * 5. 内部类编译后.class文件明明: 外部类$内部类.class
     */
    //注: 不加public的话只能在同胞中调用
    public class Heart {
        int age = 13;
        int temp = 22;
        public String beat(){
            eat();
            return Person.this.age+"心脏在跳动";
        }
    }
}

测试类

package com.vb.people;

public class PeopleTest {
    public static void main(String[] args) {
        Person vb = new Person();
        vb.age = 25;

        // 同包下访问内部类
//        Heart heart = new Heart();    //不可行
        //获取内部类对象实例:  ==>
        //方式1:  ==> new 外部类.new 内部类
        Person.Heart myHeart = new Person().new Heart();
        System.out.println(myHeart.beat());   //0心脏在跳动

        // 方式2: 通过外部类对象获取内部类实例   ==> 外部类对象.new 内部类
        Person.Heart heart1 = vb.new Heart();
        System.out.println(heart1.beat());    //25心脏在跳动

        // 方式3: 通过外部类对象 获取方法   ==> 外部类对象.获取方法
        heart1 = vb.getHeart();
        System.out.println(heart1.beat());    //25心脏在跳动
        
    }
}

7.2 静态内部类

        静态内部类对象可以不依赖于外部类对象,直接创建

// 外部类
public class Person {
    public int age;

//    public static void eat(){
    public void eat(){
        System.out.println("People eat");
    }
    // 获取内部类的方法
    public Heart getHeart(){
        new Heart().temp = 25;
        return new Heart();
    }

 //02 静态内部类

    /**
     * 1. 静态内部类中,只能访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例
     * 2. 创建静态内部类对象实例时,不依赖于外部类对象
     * 3. 可以通过(外部类.内部类.静态成员)的方式,访问内部类中的静态成员
     * 4. 当内部类访问外部类中的静态属性,则可以通过(外部类.属性)的方式;
     *    若需要访问外部类中的静态属性,则可以通过外部类.属性的方式;
     *    若需要访问外部类中的非静态属性,则可以通过 new 外部类().属性  的方式
     */
    public static class Heart {
        public static int age = 13;
        int temp = 22;
        public static void say(){
            System.out.println("say hello");
        }
        public String beat(){
            new Person().eat();
            return new Person().age+"心脏在跳动";
        }
    }
}

测试类

public class PeopleTest {
    public static void main(String[] args) {
        Person vb = new Person();

        //获取静态内部类对象实例
        Person.Heart myHeart = new Person.Heart();
        System.out.println(myHeart.beat());
        //People eat
        //0心脏在跳动

        Person.Heart.say();             //say hello
        System.out.println(Person.Heart.age);    //13

    }
}

7.3 方法内部类

        方法内部类是定义在外部方法中的内部类,也称局部内部类

注:方法内不能定义静态成员

// 外部类
public class Person {
    public int age;

    public void eat(){
        System.out.println("People eat");
    }


    //03 方法内部类
    public Object getHeart(){
        /**
         *  1. 定义在方法内部,作用范围也在方法内
         *  2. 和方法内部成员使用规则一样,class前面不可以添加public等修饰符 & static
         *  3. 类中不能包含静态成员
         *  4. 类中可以包含final\ abstract 修饰的成员
         */
//       abstract class Heart {
        class Heart {
            public final int age = 13;
            int temp = 22;
            public final void say(){
                System.out.println("say hello");
            }

//            public abstract void eat();
            public String beat(){
                new Person().eat();
                return new Person().age+"心脏在跳动";
            }
        }
        return new Heart().beat();
    }

测试

public class PeopleTest {
    public static void main(String[] args) {
        Person vb = new Person();
        vb.age = 25;

        //03 方法内部类
        System.out.println(vb.getHeart());
        //People eat
        //0心脏在跳动

    }
}

7.4 匿名内部类

将类的定义与类的创建,放在一起完成

(1)普通方案 & 多态重载方式实现

Person.java

package com.vb.anonymous;

public abstract class Person {
    private String name;
    public Person(){

    }

    public String getName() {
        return name;
    }

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

    public abstract void read();
}

Man.java

package com.vb.anonymous;

public class Man extends Person{
    @Override
    public void read() {
        System.out.println("Man read");
    }
}

Woman.java

package com.vb.anonymous;

public class Woman extends Person {
    @Override
    public void read() {
        System.out.println("Woman read");
    }
}

Test

public class PersonTest {
    // 需求: 根据传入不同的人的类型, 调用对应的方法

    // 方案1:
//    public void getRead(Man man){
//        man.read();
//    }
//    public void getRead(Woman woman){
//        woman.read();
//    }

    // 方案 2  多态=>方法的重载
    public void getRead(Person person){
        person.read();
    }

    public static void main(String[] args) {
        PersonTest test = new PersonTest();
        Man man = new Man();
        Woman woman = new Woman();
        test.getRead(man);       //Man read
        test.getRead(woman);     //Woman read
    }
    
}

(2)匿名内部类实现

public class PersonTest {
    // 需求: 根据传入不同的人的类型, 调用对应的方法

    public void getRead(Person person){
        person.read();
    }

    public static void main(String[] args) {
        PersonTest test = new PersonTest();

        // 方案3: 匿名内部类
        /**
        * 1. 匿名内部类没有类型名称\ 实例对象名称
         * 2. 编译后的文件命名: 外部类$数字.class
         * 3. 无法使用访问修饰符& static &abstract
         * 4. 无法编写构造方法
         * 5. 无法出现静态成员
         * 6. 可以实现接口,也可以继承父类,但不可兼得

         * 实例对象的同时,完成对于对象内容的编写
         * 适用于: 只用到类的一个实例的场景
         *        在类的定义后马航用到
         *        给类的命名并不会导致代码更容易被理解
         */
        test.getRead(new Person() {

            @Override
            public void read() {
                System.out.println("man read");        //man read
            }
        });

        test.getRead(new Person(){
            @Override
            public void read(){
                System.out.println("woman read");      //woman read
            }
        });
    }
}

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

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

相关文章

在服务器上安装AlphaFold2遇到的问题(3)_cat: /usr/include/cudnn_version.h: 没有那个文件或目录

[rootlocalhost ~]# cat /usr/include/cudnn_version.h cat: /usr/include/cudnn_version.h: 没有那个文件或目录这个错误表明系统找不到 cudnn_version.h 头文件,说明 cuDNN 的开发文件(头文件)没有正确安装。以下是完整的解决方案&#xff…

实验-实现向量点积-RISC-V(计算机组成原理)

目录 一、实验内容 二、实验步骤 三、源代码 四、实现效果 五、实验环境 六、实验小结与思考 一、实验内容 首先,我们用一个简单的“向量点积”运算作为热身。你将拿到一个不完整的汇编代码“task2-向量点积”,我们的目标是按照C语言描述的功能&a…

描述性统计工具 - AxureMost 落葵网

描述性统计工具是用于汇总和分析数据,以更好地了解数据特征的工具1。以下是一些常见的描述性统计工具简介: 描述性统计工具 Excel 基本统计函数:提供了丰富的函数用于计算描述性统计量。例如,AVERAGE 函数用于计算平均值&#xf…

麒麟桌面系统文件保险箱快捷访问指南:让重要文件夹一键直达桌面!

往期文章链接:统信操作系统自定义快捷键配置音量调节功能指南 Hello,大家好啊,今天给大家带来一篇麒麟桌面操作系统上配置文件保险箱内文件夹桌面快捷方式的文章,欢迎大家分享点赞,点个在看和关注吧!在日常…

从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区

目录 前言 一、从硬件角度理解"Linux下一切皆文件" 从理解硬件是种“文件”到其他系统资源的抽象 二、缓冲区 1.缓冲区介绍 2.缓冲区的刷新策略 3.用户级缓冲区 这个用户级缓冲区在哪呢? 解释关于fork再加重定向“>”后数据会打印两份的原因 4.内核缓冲…

游戏站的几种形式

游戏站点的主要形式:单品游戏站、游戏盒子站与单类型游戏盒子站 随着互联网的普及和游戏产业的快速发展,游戏站点作为玩家获取游戏资源和信息的重要平台,呈现出多种形式。本文将分析三种常见的游戏站点形式:单品游戏站、游戏盒子站…

打造智能化军工软件工厂,破解版本管理难题

在数字化浪潮席卷全球的当下,军工行业正经历着前所未有的软件工业化转型。作为这一进程的核心支撑,软件工厂模式正在重塑军工领域的研发体系。然而,传统版本管理方式已难以适应现代军工软件研发的复杂需求,成为制约行业发展的关键…

SpringbBoot nginx代理获取用户真实IP

为了演示多级代理场景,我们分配了以下服务器资源: 10.1.9.98:充当客户端10.0.3.137:一级代理10.0.4.105:二级代理10.0.4.129:三级代理10.0.4.120:服务器端 各级代理配置 以下是各级代理的基本配…

allure报告自定义logo和名称

根据pytest框架,做自动化测试的时候,选择的是allure测试报告,这个报告是目前所有报告中功能最强大最好用的测试报告之一 我们在使用这个测试报告的时候,怎么样去把allure的logo和名称替换成自己公司或者自己的logo呢?…

【AI论文】对抗性后期训练快速文本到音频生成

摘要:文本到音频系统虽然性能不断提高,但在推理时速度很慢,因此对于许多创意应用来说,它们的延迟是不切实际的。 我们提出了对抗相对对比(ARC)后训练,这是第一个不基于蒸馏的扩散/流模型的对抗加…

测试工程师如何学会Kubernetes(k8s)容器知识

Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…

遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1542 标注数量(xml文件个数):1542 标注数量(txt文件个数):1542 …

每日Prompt:迷你 3D 建筑

提示词 3D Q版迷你风格,一个充满奇趣的迷你星巴克咖啡馆,外观就像一个巨大的外带咖啡杯,还有盖子和吸管。建筑共两层,大大的玻璃窗清晰地展示出内部温馨而精致的设计:木质的家具、温暖的灯光以及忙碌的咖啡师们。街道…

el-breadcrumb 面包屑第一项后面怎么写没有分隔符

<el-breadcrumb separator"/"><el-breadcrumb-item>当前位置&#xff1a;</el-breadcrumb-item><el-breadcrumb-item :to"{ path: / }">首页</el-breadcrumb-item><el-breadcrumb-item><a href"/">活…

MYSQL 高可用

目录 一 什么是MYSQL高可用 1.1 什么是MySQL高可用 1.2方案组成 1.3 优势 2.1 案例环境 二 案例实施 1.安装mysql数据库 &#xff08;1 基础环境 &#xff08;2二进制安装进行bash (3 设置配置文件 MYSQL 的配置文件跟上面编译安装的配置文件类似 &#xff08;4. 配…

【GaussDB迁移攻略】DRS支持CDC,解决大规模数据迁移挑战

目录 1 背景介绍 2 CDC的实现原理 3 DRS的CDC实现方式 4 DRS的CDC使用介绍 5 总结 1 背景介绍 随着国内各大行业数字化转型的加速&#xff0c;客户的数据同步需求越来越复杂。特别是当需要将一个源数据库的数据同时迁移到不同的目标库场景时&#xff0c;华为云通常会创建…

HoloTime:从一张图片生成可交互的4D虚拟世界——突破静态生成模型,重构VR/AR内容生产范式

引言:静态生成模型的局限与HoloTime的突破 在空间智能与虚拟内容生成领域,传统生成模型(如扩散模型)面临两大瓶颈: 静态输出:仅能生成固定视角的3D场景或局部物体动画。沉浸感缺失:无法构建用户可“走进去”的动态4D空间(时间+空间)。HoloTime 通过“图像→全景视频→…

【深度学习】#11 优化算法

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…

根据台账批量制作个人表

1. 前期材料准备 1&#xff09;要有 人员总的信息台账 2&#xff09;要有 个人明白卡模板 2. 开始操作 1&#xff09;打开 人员总的信息台账&#xff0c;选择所需要的数据模块&#xff1b; 2&#xff09;点击插入&#xff0c;选择数据透视表&#xff0c;按流程操作&…

LocaleContextResolver实现多语言切换-笔记

1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale&#xff08;语言环境&#xff09; 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…