Java从入门到精通(四)· 面向对象

news2024/9/25 7:24:53

Java从入门到精通(四)· 面向对象

一 静态关键字(static)

static表示静态关键字,可以用来修饰成员变量成员方法

static修饰的成员变量,称之为静态成员变量或者类变量,同理可得,被修饰的成员方法称之为静态成员方法或者类方法

public static String name="shawn";
void test(){
    System.out.println(name);
    System.out.println(Study08Static.name);
}

一般情况下,使用类名直接来访问类变量

被 static 修饰的关键字的特点:

属于类,与类一起加载,在内存中只有一份,会被类的所有对象共享

二 继承

1.继承的介绍

使用 extends 关键字,可以让一个类与另一个类建立起父子关系。

继承的特点:

  • 子类能够继承父类的非私有成员
  • 子类的对象是有子类和父类共同完成
  • 减少重复代码
@Data
public class Pupil extends Student {
    private String className;
    private String teacher;
}

Java 中不支持多继承,仅支持单继承,即只能继承一个多父类

2.Object类

所有的类都默认继承了Object 类。

3.方法重写

即子类重新实现父类中已存在的方法,称之为方法重写

重写父类方法需要使用 @Override 注解

public class Parent {
    public void getName(){
        System.out.println("shawn");
    }
}
//*********************************************
public class Son extends Parent {
    @Override
    public void getName() {
        System.out.println("alice");
    }
}

4.super 关键字

在子类范围访问父类的方法,如果已经对该方法进行了重写,则必须使用 super 关键字访问。

5.构造器特点

子类的全部构造器,都会先调用父类的构造器,再执行自己。

如果父类有多个构造器,则可以显示声明需要调用哪个构造器。

也可以使用 this 关键字,调用兄弟构造器

public class Parent {
    public Parent(){
        // 使用 this 关键字调用兄弟构造器
        this("shawn");
    }
    public Parent(String name){
        System.out.println(name);
    }
}

使用 super 或 this 关键字调用其他构造器时,super 或 this 必须放在第一行。由此可得, super 和 this 不能同时使用。

三 访问修饰符

访问修饰符被来用限制类中的成员能够被访问的范围

请添加图片描述

private < 缺省 < protected < public

四 多态

1.多态的概念

多态是在继承(extends)实现(implements) 情况下的一种现象,表现为:对象多态,行为多态。

People p1=new Student();
p1.work();
People p2=new Teacher();
p2.work();

其中,p1p2 表现为对象多态,而 p1.work()p2.work() 表现为行为多态。

多态的特点:编译看左边,运行看右边

2.多态的优缺点

1.多态形式下,右边对象是解耦合的,更便于维护和扩展。

解释:右边的对象如果不好用,则直接更换对象即可,无需再改动其他代码

2.定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强,更便利

3.多态的缺点:多态下的父类对象,无法使用子类的独有功能

3.多态的类型转换

  • 自动类型转换:父类 变量名=new 子类()
  • 强制类型转换:子类 变量名=(子类)父类变量
People student=new Student();
student.work();
Student stu=(Student)student;
stu.test();

注意事项:编译阶段的类型强转不会报错,但是运行阶段如果发现两个类型不能相互转换则会抛出异常

建议:强转前最好使用 instanceof 关键字,判断当前对象的真实类型,然后再进行强转

People p1=new Student();
p1.work();
if(p1 instanceof Student){
    Student stu=(Student)p1;
    stu.test();
}

五 final关键字

final 关键字,表示为”最终“的意思,一般可以用来修饰类,方法,变量。

  • 修饰类:该类被称为最终类,特点是该类不能被继承
  • 修饰方法:该方法被称为最终方法,特点是无法被重写
  • 修饰变量:该变量能且只能被赋值一次

注意:

如果 final 修饰基本类型的变量,则变量存储的数据不能被改变。

如果 final 修饰引用类型的变量,则变量存储的地址不能被改变,但是地址所指向的内容是可以被改变的。

// 数组(引用类型)的地址所指向的内容可以改变
final int [] number={1,2,34};
number[2]=111;
// 数组(引用类型)的地址不能改变(以下示例会报错)
final int [] number={1,2,34};
number[2]=111;
int [] number2={1,2,3,4};
number=number2;

使用 static final 修饰的成员变量一般被称之为常量。

常量通常用于记录一些配置信息,或是经常在项目中使用但是却不允许被修改的数据。

程序编译后,常量会被“宏替换”,即出现常量的地方都将会被替换为字面量,这样可以保证使用常量和使用字面量的性能是完全一样的。

宏替换是C/C++编程中的一个重要概念,它是在预处理阶段进行的一种文本替换机制。通过使用宏定义,可以将一段代码片段或常量定义替换为预定义的文本。

六 抽象类

1.概述

abstract 修饰的类,叫做抽象类,其中 abstract 就是抽象的含义,abstract 关键字可以修饰 成员方法

基本语法: [访问修饰符] abstract [class关键字] 类名

@Data
public abstract class AbstractParent {
    /**
     * 抽象类中的抽象方法
     */
    public abstract void getName();
    public void getAge(){
        System.out.println("抽象类中的非抽象方法");
    };
     /**
     * 抽象类中的成员属性
     */
    private String name;
}

abstract 修饰类,则该类就是抽象类,abstract 修饰方法,则该方法就是抽象方法(抽象方法必须存在于抽象类中)。

抽象方法只有方法定义,没有方法体!!!

  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类(抽象方法必须存在于抽象类中)
  • 类该有的成员(成员变量,构造函数,方法)抽象类都可以有
  • 一个类继承了抽象类,则必须完整实现抽象类中的全部抽象方法,除非这个类也是抽象类

抽象类最重要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现

2.优点

父类直到每个子类都要做某个行为,但是每个子类要做的情况不一样。这种情况下就可以将父类定义为抽象类,交给子类去重写实现。

这样设计的抽象类,可以更好的支持多态。

3.模板方法设计模式

模板方法设计模式主要用来解决方法中存在重复代码的问题

在这里插入图片描述

模版方法设计模式的写法:

  • 定义一个抽象类
  • 在里面定义两个方法:一个是模板方法,将重复代码放进去,另一个是抽象方法,具体交给子类实现

以下是抽象类:

public abstract class AbstractParent {
    /**
     * 抽象类中的抽象方法
     */
    public abstract void getName();

    public abstract void getSex();
    
    // 这里的getinfo()就是模板方法,
    public final void getInfo(){
        getName();
        System.out.println("这是我的年龄啊");
        getSex();
    }
}

以下是抽象类的实现类:

public class ExtendsSon extends AbstractParent {
    @Override
    public void getName() {
        System.out.println("这是名字");
    }
    @Override
    public void getSex() {
        System.out.println("这是性别");
    }
}

演示示例:

public static void main(String[] args) {
    AbstractParent abstractParent=new ExtendsSon();
    abstractParent.getInfo();
}

为放置模板方法被重写,可以对模板方法添加final关键字

七 接口

1.概述

Java提供了一个关键字 interface,使用这个关键字可以用来定义接口。接口中包含成员变量,成员方法。

public interface A {
    /**
     * 在接口中定义的成员变量,默认为常量
     */
    String studentName="Shawn";
    /**
     * 定义接口(省略访问修饰符,接口中定义的方法默认为抽象方法)
     */
    void getName();
}

特点:接口不能创建对象,接口是用来被实现的

2.优点

接口的好处:

  • 弥补了类只能单继承的不足,一个类可以同时实现多个接口
  • 让程序可以面向接口编程,方便灵活的切换各种业务

3.接口中的其他成员

JDK8以后,接口中新增的三种方法:

  • 默认方法:必须使用 default 关键字修饰,默认会被 public 修饰,且JDK8以后开始支持
  • 私有方法:必须使用 private 修饰,只能在默认方法中使用,且JDK9以后才开始支持
  • 静态方法:JDK8以后,接口中可以定义静态方法,需要使用 static 关键字修饰,无需访问修饰符
public interface B {
    /**
     * 默认方法 必须使用 `default` 关键字修饰,默认会被 `public` 修饰
     * @return
     */
    default String getName(){
        System.out.println("仅仅是测试");
        getAge();
        return "shawn";
    }
    /**
     * 接口中的私有方法
     */
    private void getAge(){
        System.out.println("这是私有方法");
    }
    /**
     * 接口中的静态方法
     */
    static void getAge(){
        System.out.println("接口中的静态方法");
    }
}

增加以上三种方法的原因:

  • 增强了接口的功能,可以直接编写方法
  • 可以为实现类扩展通用性的功能,而不需要实现类去实现

4.多继承的注意事项

同时集成的多个接口中如果存在名称冲突的方法,此时则无法进行多继承。

如果接口中存在与实现类同名的默认方法,则优先调用接口中的默认方法

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

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

相关文章

前端性能优化介绍与常见方法(二)

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 目录 一、…

条件竞争漏洞Double Fetch

前言 Double Fetch(双取)是一种条件竞争的漏洞&#xff0c;相关的论文发表在USENIX&#xff0c;论文链接&#xff1a;https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-wang.pdf Double Fetch Double Fetch是内核的一种漏洞类型&#xff0c;发生在内…

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

目录 往期文章传送门 一、控制流 &#xff08;Control Flow&#xff09;和 Trap 二、Exceptions, Traps, and Interrupts Contained Trap Requested Trap Invisible Trap Fatal Trap 异常和中断的异同 三、RISC-V的异常处理 mtvec&#xff08;Machine Trap-Vector Ba…

【福利】免费白嫖Notability订阅版,无需越狱,支持无限笔记!

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 视频教程&#xff1a;【福利】免费白嫖Notability订阅版&#xff0c;无需越狱&#xff0c;支持无限笔记&#xff01;_哔哩哔哩_bilibili 下载爱思助手 连接iPad 搜索并安装12.1.8版本的notability iPad上打开软件…

redis初级redis入门redis数据类型redis常用命令redis持久化机制

Redis 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作RedisRedis持久化机制 1. Redis入门 1.1 Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 **官网&#xff1a;**https://redis.io **中文网&…

SpringBoot多环境切换及JSR303数据校验

多环境切换 profile是Spring对不同环境提供不同配置功能的支持&#xff0c;可以通过激活不同的环境版本&#xff0c;实现快速切换环境&#xff1b; 多配置文件 我们在主配置文件编写的时候&#xff0c;文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版…

高速公路巡检新手段——道路智能巡检系统

高速公路作为我国公路建设的一项重要成果&#xff0c;其建设和运营对于促进我国经济发展、改善交通运输条件和提高人民生活水平具有重要的意义。 高速公路巡检是确保公路安全的重要措施之一。每年数以万计的车辆在高速公路上穿行&#xff0c;因此高速公路的安全性显得尤为重要。…

【Hbuilder+夜神模拟器】连接过程中遇到的坑

1、安装 HBuilder X 官网戳这里 选择适合你的版本 双击直接运行 夜神模拟器官网戳这里 选择适合你的版本 双击直接运行 2、Hbuilder中配置 打开工具—设置—运行配置 adb路径可以点击右侧的浏览找到bin文件夹下的nox_adb.exe&#xff0c;Android模拟器端口默认是62001&…

释放OMO(线下线上融合)的力量:打造最强私域运营

在零售领域&#xff0c;新技术的出现促进了创新业务战略的发展&#xff0c;其中一种策略是OMO&#xff0c;即线下合并线上&#xff0c;它结合了线上和线下零售的优势&#xff0c;为客户提供无缝的购物体验。由于企业即时消息在在线客户沟通中发挥着重要作用&#xff0c;OMO 随着…

如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器

文章目录 前言一、认识注解&#xff1a;RestControllerAdvice和ExceptionHandler二、使用步骤1、封装统一返回结果类2、自定义异常类封装3、定义全局异常处理类4、测试 总结 前言 全局异常处理器是一种 &#x1f31f;✨机制&#xff0c;用于处理应用程序中发生的异常&#xff…

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段,sql成功执行,但是updates为0,更新失败的解决办法

使用mybatis-plus的updateById方法更新一个numeric(1)类型字段&#xff0c;sql成功执行&#xff0c;但是updates为0&#xff0c;更新失败的解决办法&#xff1a; 背景&#xff1a;我有一张表&#xff0c;有个启用禁用功能&#xff0c;没有放在编辑页面一起编辑保存&#xff0c;…

使用sysbench对mysql数据库进行基准测试

目录 一、 安装sysbench 二、准备测试表及数据 三、开始测试 1、测试综合TPS 2、只读性能 oltp_read_only 3、删除性能 oltp_delete 4、更新索引字段性能 oltp_update_index 5、更新非索引字段性能 oltp_update_non_index 6、插入性能 oltp_insert 7、写入性能 ol…

SpringBoot Web开发静态资源处理

Web开发探究 简介 其实SpringBoot的东西用起来非常简单&#xff0c;因为SpringBoot最大的特点就是自动装配 使用SpringBoot的步骤&#xff1a; 1、创建一个SpringBoot应用&#xff0c;选择我们需要的模块&#xff0c;SpringBoot就会默认将我们的需要的模块自动配置好 2、手动…

湘大oj1138爱你一生一世题解:最大公约数 逆向思维 int整除会向下取整

一、链接 爱你一生一世 二、题目 题目描述 在2013年1月4日&#xff0c;这个“爱你一生一世”的特别日子&#xff0c;男生都想向自己的喜欢的女生表达爱意。 你准备在该死的C语言考试后&#xff0c;去向她&#xff08;或者他&#xff1f;&#xff09;告白。告白怎么能缺了礼…

八大排序

目录 选择排序-直接插入排序 插入排序-希尔排序 选择排序-简单选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序 归并排序 基数排序 选择排序-直接插入排序 基本思想: 如果碰见一个和插入元素相等的&#xff0c;那么插入元素把想插入的元素放在相等元素…

如何高效地阅读 Python 代码?

原文首发于&#xff1a;如何高效地阅读 Python 代码&#xff1f; | 今是昨非 | 技术.生活.阅读.思考 副标题&#xff1a;一个重要但很少被讨论的技能 从网上看到这篇英文文章&#xff0c;感觉还不错&#xff0c;翻译了一下。Claude2 也有参与翻译&#x1f61d; AI摘要 这篇文…

Linux基础与拓展

文章目录 虚拟机网络连接方式VIMvi和vim常用的三种模式各种模式的相互切换快捷键 用户管理权限 基本介绍&#xff1a;添加用户指定/修改密码删除用户切换用户用户组 路径命令学习mkdir命令介绍语法注意 touch 创建文件介绍语法 cat 查看文件内容介绍语法 more 查看文件内容介绍…

vue3报错

这是因为eslint对代码的要求严格导致的&#xff0c;可以在package.json里面删掉"eslint:recommended"&#xff0c;然后重启就可以正常运行了

软件编程专业:探索计算机世界的奥秘

软件编程专业&#xff1a;探索计算机世界的奥秘 随着科技的飞速发展&#xff0c;计算机已经渗透到我们生活的方方面面。我们每天都在使用各种应用程序&#xff0c;比如社交媒体、游戏和电子邮件等&#xff0c;而这些应用程序背后的魔法都是由软件编程专业的人创造的。那么&…

Android 面试重点之Framework (Handler篇)

近期在网上看到不少Android 开发分享的面试经验&#xff0c;我发现基本每个面经中多多少少都有Framework 底层原理的影子。它也是Android 开发中最重要的一个部分&#xff0c;面试官一般会通过 Framework底层中的一些逻辑原理由浅入深进行提问&#xff0c;来评估应聘者的真实水…