【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、发货准备 在开始空运之前,首先需要进行发货准备。这包括将货物送达指定的…

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中…

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

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

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…

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 异常…

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

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

Nodejs process.nextTick() 使用详解

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

OpenCV 为轮廓创建边界框和圆(62)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV检测凸包(61) 下一篇 :OpenCV如何为等值线创建边界旋转框和椭圆(62) ​ 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::boundingRect使用 OpenCV 函数 cv::mi…

数据库(MySQL)—— 事务

数据库(MySQL)—— 事务 什么是事务事务操作未控制事务测试异常情况 控制事务一查看/设置事务提交方式:提交事务回滚事务 控制事务二开启事务提交事务回滚事务 并发事务问题脏读(Dirty Read)不可重复读(Non…

数据结构练习题---环形链表详解

链表成环,在力扣中有这样的两道题目 https://leetcode.cn/problems/linked-list-cycle/ https://leetcode.cn/problems/linked-list-cycle-ii/description/ 这道题的经典解法是利用快慢指针,如果链表是一个环形链表,那么快指针(fast)和慢指…

关于MS-DOS时代的回忆

目录 一、MS-DOS是什么? 二、MS-DOS的主要功能有哪些? 三、MS-DOS的怎么运行的? 四、微软开源MS-DOS源代码 五、高手与漂亮女同学 一、MS-DOS是什么? MS-DOS(Microsoft Disk Operating System)是微软公…

工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px); 毛玻璃效果,在安卓机上有兼容问题,添加兼容前缀也无效; 解决方案:让设计师调整渐变,不要使用该属性! 复制代码 background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba…

C++类定义时成员变量初始化

在C11中允许在类定义时对成员变量初始化。 class A { public:A() { }void show(){cout << "m_a " << m_a << endl;cout << "m_b " << m_b << endl;} private:int m_a 10;//类定义时初始化int m_b; //没有初始化…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

Delta lake with Java--liquid clustering

网上说liquid clustering还是实验阶段&#xff0c;python和scala有对应的函数&#xff0c;java没有&#xff0c;只能用sql语句来建表&#xff0c;尝试了两天&#xff0c;遇到很奇怪的情况&#xff0c;先上代码&#xff1a; import io.delta.tables.DeltaTable; import org.apa…