【Java】面向对象核心知识点(二),文章层次分明,内容精益求精,代码简单易懂

目录

一、构造方法

1.1 概念

1.2 作用

1.3 代码

二、抽象

2.1 概念

2.2 作用

2.3 注意

2.4 代码

三、接口

3.1 概念

3.2 作用

3.3 注意

3.4 语法

3.5 代码

四、内部类

4.1 成员内部类

4.2 局部内部类

4.3 静态内部类

4.4 匿名内部类


(原创文章,转载请注明出处)

博主是计算机专业大学生,不定期更新原创优质文章,感兴趣的小伙伴可以关注博主主页支持一下,您的每一个点赞、收藏和关注都是对博主最大的支持!


一、构造方法

1.1 概念

  • 构造方法是一种特殊的方法,在创建对象(通过new󠁪关键字)时被自动调用。
  • 构造方法的名称与类名完全相同,并且没有返回类型(即使它是void󠁪也不行)。
  • 在Java中,一个类可以有多个构造方法,可以有不同的参数列表以满足不同的对象创建需求。

1.2 作用

  • 对象的创建和初始化:构造方法用于创建对象并初始化对象的状态
  • 属性的赋值:构造方法可以接受参数,并使用这些参数来完成对对象属性的赋值

1.3 代码

(1)无参构造

① 例子类

public class Example {// 无参构造public Example() {System.out.println("自动调用了无参构造");}
}

② 测试类

public class ExampleTest {public static void main(String[] args) {new Example();// 输出:自动调用了无参构造}
}

(2)含参构造

① 学生类

public class Student {String name;Integer age;// 含参构造public Student(String name, Integer age) {this.name = name;this.age = age;System.out.println("自动调用了含参构造");System.out.println("姓名:" + this.name + ",年龄:" + this.age);}
}

② 测试类

public class StudentTest {public static void main(String[] args) {new Student("张三", 22);// 输出:// 自动调用了含参构造// 姓名:张三,年龄:22}
}

二、抽象

2.1 概念

(1)抽象类

  • 在Java中,使用abstract󠁪关键字定义的类称为抽象类。
  • 抽象类是一个不能被实例化的类。它只能被继承。抽象类中可以包含普通方法的定义和实现,也可以包含抽象方法的定义。

(2)抽象方法

  • 在Java中,使用abstract󠁪关键字定义的方法称为抽象方法。
  • 抽象方法是一种没有实现的方法,需要在继承的子类中进行具体实现。如果一个类包含抽象方法,那么该类必须被声明为抽象类。

2.2 作用

  • 代码复用:把相同的代码抽抽取到父类(抽象类),实现了多态性并提高代码的灵活性
  • 强制重写:让继承抽象类的子类强制重写父类中的方法,或者说防止子类遗忘重写

2.3 注意

  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类不能实例化;但抽象类中可以有构造方法(用于给属性赋值)
  • 抽象类的子类,要么重写抽象类中的所有抽象方法,要么是抽象类

2.4 代码

① 父类

// 抽象类
public abstract class Father {// 成员变量private String name;// 抽象方法public abstract String say();// 构造方法public Father(String name) {this.name = name;}// 实例方法public String getName() {return name;}public void setName(String name) {this.name = name;}
}

② 子类

public class Child extends Father {// 强制实现父类构造方法public Child(String name) {super(name);}// 强制实现父类抽象方法@Overridepublic String say() {return this.getName() + "实现了父类构造方法";}
}

③ 测试类

public class Test {public static void main(String[] args) {Child child = new Child("子类");System.out.println(child.say());// 输出:子类实现了父类构造方法}
}

三、接口

3.1 概念

  • 接口是一种抽象数据类型,定义了一组方法的契约。
  • 接口使用interface󠁪关键字定义,强调类型的抽象和行为的规范。
  • 接口包含全局变量和抽象方法(JDK8之前不能包含普通方法,JDK8重新定义接口,可包含默认方法和静态方法(也叫类方法)。

接口定义如下:

public interface MyInterface {// 全局常量(Fields)String NAME = "全局常量";// 抽象方法(Abstract Methods)String abstractMethods();// 默认方法(Default Methods)default String defaultMethods() {return "默认方法";}// 静态方法(Static Methods)static String staticMethods() {return "静态方法";}// 嵌套类型(Nested Types)/* 嵌套的接口、类或枚举 */
}

说明:

  • 接口中的全局常量默认使用“public static final”进行修饰,修饰符可省
  • 接口中的抽象方法默认使用“public abstract”进行修饰,修饰符可省
  • 接口中的默认方法使用“default”修饰, 允许有方法体
  • 接口中的静态方法使用“static”修饰, 允许有方法体

3.2 作用

  • 接口是对方法进行抽象处理的规则,具有安全性,规范性,可维护性。
  • 接口的引入主要是为了实现多重继承的效果,以及定义行为的规范,使得不同的类可以共享相同的行为定义。

3.3 注意

  • 接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类。
  • 接口不能实例化;接口和类之间是实现关系,通过implements实现接口。
  • 使用接口的目的是为了克服单继承的限制,一个类只能有一个父类,而一个接口可以同时继承多个父接口。
  • 与抽象类不同,接口不能有构造方法,也不能有实例变量(只能有静态常量)。

3.4 语法

(1)子接口可继承多个父接口

修饰符 interface 子接口 extends 父接口1,父接口2,... { ... }

(2)类通过implements实现接口

修饰符 class 类名 implements 接口1,接口2,...{ ... }

(3)子类继承父类并实现接口

修饰符 class 子类 extends 父类 implements 接口1,接口2,...{ ... }

3.5 代码

① 接口

public interface MyInterface {// 全局常量(Fields)String NAME = "全局常量";// 抽象方法(Abstract Methods)String abstractMethods();// 默认方法(Default Methods)default String defaultMethods() {return "默认方法";}// 静态方法(Static Methods)static String staticMethods() {return "静态方法";}
}

② 父类

public abstract class Father {abstract String say();
}

③ 子类

public class Child extends Father implements MyInterface {@Overridepublic String abstractMethods() {return "强制重写接口抽象方法";}@Overridepublic String defaultMethods() {return "强制重写接口默认方法";}@OverrideString say() {return "强制重写父类抽象方法";}
}

④ 测试类

public class InterfaceTest {public static void main(String[] args) {Child child = new Child();System.out.println(child.NAME);System.out.println(child.abstractMethods());System.out.println(child.defaultMethods());System.out.println(child.say());// 输出:// 全局常量// 强制重写接口抽象方法// 强制重写接口默认方法// 强制重写父类抽象方法}
}

四、内部类

4.1 成员内部类

(1)概念:在一个类中定义的类被称为成员内部类

(2)功能:成员内部类可以访问外部类的所有成员(包括属性和方法)

(3)语法:

//实例化成员内部类对象语法格式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

(4)代码:

① 成员内部类

class Outer {String outerAttribute = "外部类成员属性";String outerMethod() {return "外部类成员方法";}// 定义成员内部类并使用成员方法和属性class Inner {String getOuterAttribute() {return outerAttribute;}String getOuterMethod() {return outerMethod();}}
}

② 测试类

public class InnerTest {public static void main(String[] args) {Outer.Inner inner = new Outer().new Inner();System.out.println(inner.getOuterAttribute());System.out.println(inner.getOuterMethod());// 输出:// 外部类成员属性// 外部类成员方法}
}

4.2 局部内部类

(1)概念:在方法中定义的类被称为局部内部类(也称方法内部类)

(2)功能:局部内部类可以访问外部类的所有成员(包括属性和方法),但局部内部类中变量和方法却只能在所属方法中访问

(3)代码

import org.junit.Test;public class Outer {String outerAttribute = "外部类成员属性";String outerMethod() {return "外部类成员方法";}// 单元测试@Testpublic void show() {// 定义局部内部类并使用成员方法和属性class Inner {String getOuterAttribute() {return outerAttribute;}String getOuterMethod() {return outerMethod();}}// 注意:局部内部类只能在外部类的方法中创建对象并使用Inner inner = new Inner();System.out.println(inner.getOuterAttribute());System.out.println(inner.getOuterMethod());// 输出:// 外部类成员属性// 外部类成员方法}
}

4.3 静态内部类

(1)概念:使用static关键字修饰的成员内部类称为静态内部类

(2)功能:静态内部类只能访问外部类的静态成员(包括属性和方法)

(3)语法:

//实例化静态内部类对象语法格式
外部类.内部类 变量名 = new 外部类.内部类();

(4)代码

① 静态内部类

public class Outer {static String outerAttribute = "外部类成员属性";static String outerMethod() {return "外部类成员方法";}// 定义静态内部类并使用成员方法和属性static class Inner {String getOuterAttribute() {return outerAttribute;}String getOuterMethod() {return outerMethod();}}
}

② 测试类

public class InnerTest {public static void main(String[] args) {Outer.Inner inner = new Outer.Inner();System.out.println(inner.getOuterAttribute());System.out.println(inner.getOuterMethod());// 输出:// 外部类成员属性// 外部类成员方法}
}

4.4 匿名内部类

(1)概念:没有名称的内部类称为匿名内部类,为一个表达式,非常规的类

(2)功能:可以通过匿名对象重写方法,不用再进行实例化对象,可节省代码

(3)语法:

new 父类/接口(参数){@Override重写父类/接口方法
}

可以简单理解为:匿名内部类本质上是一个没有名字的子类对象、或者接口的实现类对象

(4)代码:

① 父类

public abstract class Father {public abstract void show();
}

② 测试类

public class AnonymityInnerTest {public static void main(String[] args) {// 这里new的后面部分,其实就是一个Father的子类对象new Father() {@Overridepublic void show() {System.out.println("重写父类抽象方法");}}.show(); // 调用匿名内部类继承父类的方法// 输出:重写父类抽象方法}
}

若有不妥之处,恳请读者批评指正

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

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

相关文章

WWW‘24 | 课程学习CL+模仿学习IL用于ETF及商品期货交易

WWW24 | 课程学习CL模仿学习IL用于ETF及商品期货交易 原创 QuantML QuantML 2024-05-04 13:47 论文地址:[2311.13326] Curriculum Learning and Imitation Learning for Model-free Control on Financial Time-series (arxiv.org) 本文探讨了在金融时间序列数据上…

W801学习笔记十七:古诗学习应用——上

硬件驱动以及软件架构大体上已经完成,尚存一些遗漏之处,后续会寻找合适的时机进行补充。自此章起,将正式迈入软件应用阶段,尤其是游戏开发领域。 关于第一个应用,此前已有一些构想: 其一,随机…

【跟我学RISC-V】(二)RISC-V的基础知识学习与汇编练习

写在前面: 这篇文章是跟我学RISC-V的第二期,是第一期的延续,第一期主要是带大家了解一下什么是RISC-V,是比较大体、宽泛的概念。这一期主要是讲一些基础知识,然后进行RISC-V汇编语言与c语言的编程。在第一期里我们搭建了好几个环…

FBA头程空运发货流程详解|携手天图通逊,开启高效跨境物流之旅

在众多头程发货方式中,空运以其速度快、时效高的特点,成为许多卖家特别是急需快速补货或应对市场变化的友好选择,那FBA头程空运的发货流程是怎样的呢? 1、发货准备 在开始空运之前,首先需要进行发货准备。这包括将货物送达指定的…

【C++并发编程】(三)互斥锁:std::mutex

文章目录 互斥锁数据竞争C互斥锁lock() 和 unlock()std::lock_guard 互斥锁 数据竞争 在并发编程中,数据竞争是指多个线程同时对共享数据进行读写操作,并且至少有一个线程进行写操作,从而导致未定义的行为或结果。 下面给出一个例子&#x…

DETR类型检测网络实验2---优化测试

补全reference_point Anchor-DETR提出用预定义的参考点生成query_pos; DBA-DETR提出预定义参考信息由(x,y)增至(x,y,w,h) 那么在3D检测任务中是否可以把预定义参考信息补全为(x,y,z,l,w,h,sint,cost),而query_pos都是使用xy两个维度(因为是bev网络). (这种方法在Sparse-DETR中…

轻松应对数据恢复挑战:雷神笔记本,不同情况不同策略

在数字化时代,数据无疑是我们生活中不可或缺的一部分。无论是重要的工作文件、珍贵的家庭照片,还是回忆满满的视频,一旦丢失,都可能给我们的生活带来诸多不便。雷神笔记本作为市场上备受欢迎的电脑品牌,用户在使用过程…

计算机网络实验二:交换机的基本配置与操作

实验二:交换机的基本配置与操作 一、实验要求 (1)掌握windows网络参数的设置(TCP/IP协议的设置); (2)掌握交换机命令行各种操作模式的区别,以及模式之间的切换; (3)掌握交换机的全局的基本配置; (4)掌握交换机端口的常用配置参数; (5)查看交换机系统和…

Adobe-Premiere-CEP 扩展 入门-视频剪辑-去气口插件-Silence Remover

短视频,这两年比较火,不要再问为什么用Premiere,非常难用,为什么不用某影,某些国内软件非常接地气简单,又例如某音资深的视频短编辑就很好用了。。。 Premiere二次开发调试难,不如自己搞个cons…

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

在 csdn.net 下载 strawberry-perl-5.32.1.1-64bit.zip 解压安装在 D:\Strawberry\ 运行 cpan install MIDI::Simple D:\Strawberry\c\bin\gmake.exe test -- OK Running make install for CONKLIN/MIDI-Perl-0.84.tar.gz Installing D:\Strawberry\perl\site\lib\MIDI.pm I…

libcity 笔记:支持的数据集

1 支持的数据集(model) 1.1 traffic_state_pred HA历史平均值,将历史流量建模为季节性过程,然后使用前几个季节的加权平均值作为预测值。VAR向量自回归SVR支持向量回归ARIMAAutoEncoderSeq2Seq采用基于门控循环单元的编码器-解码…

kubebuilder(6)webhook

operator中的webhook也是很重要的一块功能。也是相对比较独立的模块,所以放在后面讲。 webhook是一个callback,注册到k8s的api-server上。当某个特定的时间发生时,api server就会查询注册的webhook,并根据一些逻辑确认转发消息给…

【ARM Cortex-M3指南】3:Cortex-M3基础

文章目录 三、Cortex-M3基础3.1 寄存器3.1.1 通用目的寄存器 R0~R73.1.2 通用目的寄存器 R8~R123.1.3 栈指针 R133.1.4 链接寄存器 R143.1.5 程序计数器 R15 3.2 特殊寄存器3.2.1 程序状态寄存器3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器3.2.3 控制寄存器 3.3 操作模式3.4 异常…

KNN算法详解

KNN分类算法 K最近邻(K-Nearest Neighbors,KNN)算法是一种简单且直观的监督学习算法,用于分类和回归问题。在KNN分类中,通过将新数据点的特征与训练数据中的所有点进行比较,确定其最近邻居,并将…

经典后台管理UI控制台

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>西门星空乐园管理后台</title><script src"../vue_js/vue.js"></script><style>body {margin: 0;padding: 0;width…

MRI学习笔记-spm独立样本t检验

SPM操作&#xff1a; 9-SPM-fmri任务态 二阶分析&#xff1a; 双样本t检验 - 知乎 (zhihu.com) 批处理脚本&#xff1a; clc; clear; nmodel 3; numsub 27; rootdir D:\LLYdata\motor_inhibition_data2\motor_inhibition_fmri;%数据最上层路径 ffxname data_05_1st_leve…

使用FPGA实现串-并型乘法器

介绍 其实我们知道&#xff0c;用FPGA实现乘法器并不是一件很简单的事&#xff0c;而且在FPGA中也有乘法器的IP核可以直接调用&#xff0c;我这里完全就是为了熟悉一些FPGA的语法然后写了这样一个电路。 串-并型乘法器模块 从字面上看&#xff0c;串-并乘法器就是其中一个乘数…

Java面试问题及答案

Java面试问题及答案 以下是几个Java面试中可能会问到的问题及其答案。 1. 解释Java中的多态性是什么&#xff0c;以及它是如何工作的&#xff1f; 问题&#xff1a; 在Java中&#xff0c;多态性是指允许不同类的对象对同一消息做出响应的能力&#xff0c;即同一个接口可以被…

FastApi个人笔记

FastApi笔记 学习FastApi建议直接看官方文档:官方文档 文章目录 FastApi笔记一、环境准备1.1 安装Fast Api 二、第一个Restful API2.1 创建第一个代码框架async作用[(引自CSDN)](https://blog.csdn.net/The_Time_Runner/article/details/105646363): 2.2 运行第一个代码2.3 Swa…

Nodejs process.nextTick() 使用详解

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…