【Java基础入门篇】三、面向对象和JVM底层分析(3)

Java基础入门篇


三、面向对象和JVM底层分析

3.5 抽象类/接口和外/内部类

(1)抽象类

**“抽象方法”**是使用abstract修饰的方法,没有方法体,只有声明,定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。
**“抽象类”**是包含抽象方法的类,通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
抽象类的使用要点:

  1. 有抽象方法的类只能定义成抽象类
  2. 抽象类不能实例化(不能new)
  3. 抽象类可以包含属性、方法、构造方法,但是构造方法不能用来new实例,只能用来被子类调用
  4. 抽象类只能用来被继承
  5. 抽象方法必须被子类实现
package BasicJava.abstractClass;
/*
*   测试抽象类*/
public abstract class Animal {int age;public abstract void rest();public abstract void run();public void shout(){System.out.println("Animal.shout");}
}// 子类必须实现父类的抽象方法,否则会报错
class Dog extends Animal{@Overridepublic void rest() {}@Overridepublic void run() {}
}class Cat extends Animal{@Overridepublic void rest() {}@Overridepublic void run() {}
}
(2)接口

**“接口”**是一组规范,是所有类都要遵守的,面相对象的精髓就是接口,接口是比抽象类还抽象的“抽象类”,可以更加规范对子类进行约束,接口全面地专业地实现了:规范和具体实现的分离,在接口中只能有抽象的方法,不可以包含普通的属性和方法。
“接口”和实现类不是父子关系,是实现规则的关系,是多个模块之间通信的标准,做系统往往就是“面相接口”的思想来设计
“接口”定义:

  1. 访问修饰符只能是public或者默认
  2. 接口名和类名采用相同的命名机制
  3. extends部分,接口可以多继承
  4. 接口中的属性只能是常量,即用public static final修饰,不写默认也是
  5. 接口中的方法只能是public abstract,省略也是

子类通过implements来实现接口中的规范,接口不能创建实例,但是可以用于声明引用变量类型。一个类实现类接口,必须实现接口中的所有方法,并且这些方法只能是public的。

  • JDK1.8(不含8)之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法。
  • JDK1.8(含8)之后,接口中包含普通的静态方法、默认方法。

接口中定义静态方法和默认方法(JDK≥8),JDK8之前接口中只能有抽象方法
**默认方法:**使用default关键字,默认方法和抽象方法的区别是抽象方法必须被实现,默认方法不是,接口可以提供默认方法的实现,所有接口的实现类都可以得到默认方法,也可以重写
**静态方法:**在接口中定义静态方法,这个静态方法直接从属于接口(接口也是一种特殊的类),可以通过接口名调用。如果子类定义了相同名字的静态方法,那就是完全不同的方法,子类中定义的静态方法直接从属于子类,可以通过子类名直接调用
注意:默认方法相当于普通方法,可以调用静态方法,但是静态方法无法调用默认方法

package BasicJava.testInterface;public interface TestDefault {void printInfo();// 定义默认方法default void moren(){System.out.println("TestDefault.moren");System.out.println("这是一个默认方法");// 默认方法可以调用静态方法testStatic();}// 定义静态方法static void testStatic(){System.out.println("TestDefault.testStatic");}}class Test01 implements TestDefault{@Overridepublic void printInfo() {System.out.println("Test01.printInfo");}public static void testStatic(){System.out.println("Test01.testStatic");}
}
package BasicJava.testInterface;// 飞行接口
public interface Volant {/*public static final*/ int Fly_HEIGHT = 100;/*public abstract*/ void fly();
}// 善良接口
interface Honest{void helpOther();
}class GoodMan implements Honest{// 实现接口的方法@Overridepublic void helpOther() {System.out.println("扶老奶奶过马路");}
}class Angel implements Volant{// 实现接口的方法@Overridepublic void fly() {System.out.println("Angel.fly");}
}class HonestBird implements Honest, Volant{@Overridepublic void fly() {System.out.println("飞起来");}@Overridepublic void helpOther() {System.out.println("日行一善");}
}

编写主函数测试接口:

package BasicJava.testInterface;/*
*   测试接口*/
public class Test {public static void main(String[] args) {Angel a = new Angel();a.fly();HonestBird hb = new HonestBird();hb.fly();hb.helpOther();// 访问接口的常量System.out.println(Volant.Fly_HEIGHT);// 实现一个向上转型,只能使用编译类型中有的方法Volant a2 = new HonestBird();a2.fly();// 通过强制类型转换为,向下转型,使用更多的方法HonestBird hb2 = (HonestBird)a2;hb2.helpOther();// 测试默认方法System.out.println("====测试默认方法===");Test01 td = new Test01();td.moren();// 测试静态方法System.out.println("====测试静态方法===");TestDefault.testStatic(); // 直接调用接口中的静态方法Test01.testStatic(); // 不是接口的静态方法实现,相当于一个全新的方法}}

在这里插入图片描述

接口支持**“多继承”**,和类的继承类似,子接口会继承父接口的一切。

package BasicJava.testInterface;
/*
*   测试接口多继承*/
public class TestMutipleInheritance {public static void main(String[] args) {C c = new CImp01();c.testA();c.testB();c.testC();}}interface A{void testA();
}interface B{void testB();
}// C接口同时继承A,B两个接口
interface C extends A, B{void testC();
}// 实现接口C之后,需要把C继承的接口的抽象方法也实现
class CImp01 implements C{@Overridepublic void testA() {System.out.println("CImp01.testA");}@Overridepublic void testB() {System.out.println("CImp01.testB");}@Overridepublic void testC() {System.out.println("CImp01.testC");}
}

在这里插入图片描述

(3)外/内部类

**内部类:**我们把一个类放在另一个类内部定义,称为内部类(inner class),分为:

  1. 成员内部类(静态内部类、非静态内部类)
  2. 匿名内部类
  3. 局部内部类

内部类:1.提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问,2.内部类可以直接访问外部类的私有属性,内部类被当做其外部类的成员,但是外部类不能访问内部类的内部属性

  • 内部类只是**“编译”**时的一个概念,一旦变异成功,就会成为完全不同的两个类,对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。
  • 编译完成后会出现Outer.class 和 Outer.Inner.class两个类的字节码文件,所以内部类是相对独立的一种存在,其成员变量/方法名可以与外部类相同

非静态内部类:(外部类里使用非静态内部类和平时使用其他类没有什么不同):1.非静态内部类对象必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象,非静态内部类对象单独属于外部类的某个对象, 2.非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员,3.非静态内部类不能有静态方法/属性/初始化块

静态内部类:,定义方式static class ClassName{//类体},1.静态内部类可以访问外部类的静态成员,不能访问外部类的普通成员,2.静态内部类看作是外部类的一个静态成员

在内部类中进行成员变量访问要点:1.内部类属性:this.变量名,2.外部类属性:外部类名.this.变量名

package BasicJava.TestInnerClass;
/*
*   测试内部类的用法*/
public class Outer {private int age = 10;private static int b = 100;public void show(){System.out.println("Outer.show");System.out.println(age);}// 定义非静态内部类public class Inner{int age = 20;public void show(){System.out.println("Inner.show");System.out.println(age);// 访问外部类属性和方法System.out.println(Outer.this.age);Outer.this.show();}}// 定义静态内部类static class Inner2{public void test(){System.out.println(b); // 调用外部类的静态成员// System.out.println(age); // 不能调用外部类的非静态成员}}}

外部类定义内部类new Inner(),外部类以外的地方使用非静态内部类:Outer.Inner n = new Outer().new Inner();
外部类以外的地方使用静态内部类:Outer.Inner n = new Outer.Inner();

package BasicJava.TestInnerClass;
/*
*   测试创建内部类对象*/
public class TestInnerClass {public static void main(String[] args) {// 创建同一个包下的外部类对象Outer o = new Outer();o.show();// 创建同一个包下的非静态内部类对象Outer.Inner oi = new Outer().new Inner();oi.show();// 创建同一个包下的静态内部类对象Outer.Inner2 oi2 = new Outer.Inner2();oi2.test();}
}

在这里插入图片描述

匿名内部类:适合那种只需要使用一次的类,比如:键盘监听操作等,在“安卓开发”,awt、swing开发(窗口GUI开发)中常见,语法:new 父类构造器(实参类表) \实现接口 (){//类体}

package BasicJava.TestInnerClass;
/*
*   测试匿名内部类*/
public class TestAnonymousClass {public void test1(A a){a.run();}public static void main(String[] args) {TestAnonymousClass t1 = new TestAnonymousClass();// 原来的做法,首先额外定义一个类实现接口,再调用t1.test1(new AImpl());//匿名类的用法t1.test1(new A() {// 在这里单独实现了一次接口内容@Overridepublic void run() {System.out.println("TestAnonymousClass.run");}});t1.test1(new A() {// 在这里单独实现了一次接口内容@Overridepublic void run() {System.out.println("第二次实现匿名内部类");}});}
}//定义一个类实现接口
class AImpl implements A{@Overridepublic void run() {System.out.println("跑!");}
}
// 定一个接口
interface A{void run();
}

在这里插入图片描述

**局部内部类:**定义在方法内部,作用域只限于本方法,成为局部内部类,在实际开发中应用较少

package BasicJava.TestInnerClass;
/*
*   测试局部内部类*/
public class TestLocalClass {public void show(){// 局部内部类作用域仅限于该方法class Inner3{public void fun(){System.out.println("Hello world!");}}new Inner3().fun();}public static void main(String[] args) {new TestLocalClass().show();}}

在这里插入图片描述

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

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

相关文章

快速理解倒排索引在ElasticSearch中的作用

一.基础概念 定义: 倒排索引是一种数据结构,用来加速文本数据的搜索和检索,和传统的索引方式不同,倒排索引会被每个词汇项与包含该词汇项的文档关联起来,从而去实现快速的全文检索。 举例: 在传统的全文…

AI开发 - GPT之魂 用Python 演示chatGPT的自注意力机制 - 机器学习

自注意力机制(Self-Attention)就是让模型在处理每个词时,学会“关注重点”,而不是平均地对每个词一视同仁。这种机制让 GPT 能更聪明地理解句子的上下文和语义之间的关系。 自注意力机制是 GPT 的核心,它帮助模型在理解…

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者:来自 Elastic Annie Hansen, Stef Nestor 在本博客中,我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud(企业版)中,Elastic 在其 found-snapshots 存储…

linux下Qt程序部署教程

文章目录 [toc]1、概述2、静态编译安装Qt1.1 安装依赖1.2 静态编译1.3 报错1.4 添加环境变量1.5 下载安装QtCreator 3、配置linuxdeployqt环境1.1 在线安装依赖1.2 使用linuxdeployqt提供的程序1.3 编译安装linuxdeployqt 4、使用linuxdeployqt打包依赖1.1 linuxdeployqt使用选…

【QT】控件8

1.QDial 通过调节旋钮位置来控制窗口的不透明度&#xff1a; void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示&#xff1a; 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…

CGAL CGAL::Polygon_mesh_processing::self_intersections解析

CGAL::Polygon_mesh_processing::self_intersections 是用于检测多边形网格&#xff08;Polygon Mesh&#xff09;中的自相交的函数。自相交是指网格中的某些面&#xff08;例如三角形&#xff09;与同一网格中的其他面交叉的情况。这种情况通常是不期望的&#xff0c;因为它会…

[巅峰极客 2021]签到

[巅峰极客 2021]签到 给了我们好多表情&#xff0c;真的是一脸懵逼 注意给我们的关键词 GAME 现在还不知道是什么意思我们去试着解开一下 用这个emoji表情解密器&#xff0c;这里我找了好久才找到一个 emoji-aes 这里的Key值就是GAME 运行后出现flag NSSCTF{10ve_4nd_Peace…

005 MATLAB符号微积分

前言&#xff1a; 在MATLAB中&#xff0c;数值与符号的主要区别在于它们的处理方式和应用场景 数值计算适用于实际的数值计算问题&#xff0c;如矩阵运算、数据分析等。符号计算适用于符号推导、公式化简和符号解析&#xff0c;如理论物理和工程计算。 01 符号对象 1.基本符…

“岗位复合化、技能层次化” 高职大数据技术专业人才培养实践

在全球数字化浪潮的推动下&#xff0c;大数据技术已经成为引领社会进步和经济发展的核心动力。随着《关于深化现代职业教育体系建设改革的意见》等系列指导问文件的发布&#xff0c;我国高职大数据技术专业的教育正迎来全新机遇与挑战。这些政策不仅明确了职业教育改革的方向&a…

51c自动驾驶~合集38

我自己的原文哦~ https://blog.51cto.com/whaosoft/12358456 #GaussianPretrain 万能3D高斯预训练表示&#xff01;爆拉3D检测、Occ、高精地图等四大任务&#xff01; 受Tesla的技术的推动&#xff0c;越来越多的厂商开始走"纯视觉"的路线&#xff0c;多数方案还…

MongoDB集群分片安装部署手册

文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装&#xff08;三台均需要操作&#xff09;2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …

AIGC--------AIGC在医疗健康领域的潜力

AIGC在医疗健康领域的潜力 引言 AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;是一种通过深度学习和自然语言处理&#xff08;NLP&#xff09;等技术生成内容的方式。近年来&#xff0c;AIGC在医疗健康领域展现出了极…

数据结构 (18)数的定义与基本术语

前言 数据结构是计算机科学中的一个核心概念&#xff0c;它描述了数据元素之间的关系以及这些元素在计算机中的存储方式。 一、数的定义 在计算机科学中&#xff0c;“数”通常指的是树形数据结构&#xff0c;它是一种非线性的数据结构&#xff0c;由节点&#xff08;或称为元素…

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速&#xff0c;汽车保有量也不断增长&#xff0c;导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求&#xff0c;通常会部署监控设备进行车位监测、现场安全监测等&#xff0c;助力构建智能化停车管理。因此如何为分…

【RocketMQ事务消息如何实现】

贴上一段实现代码, 业务中可以参考使用 Component public class TestIdpSender {public void sendInTransaction(String topic, String tag, String message){Message<String> msg MessageBuilder.withPayload(message).build();String dt topic ":" tag;…

ENSP IPV6-over-IPV4

IPv6是网络层协议的第二代标准协议&#xff0c;一个IPv6地址同样可以分为网络前缀和主机ID两个部分。 可以将IPV4的网络看成IPV6的承载网&#xff0c;只有IPv4网络是连通的&#xff0c;则IPv6网络才有可能连通。所以配置的时候需要先配置IPv4网络的路由功能&#xff0c;再配IP…

vue3透传Attributes

vue3透传Attributes,组件名称上写的事件、style、类名也会生效&#xff1b; 如果是透传事件&#xff0c;点击子组件内部按钮&#xff0c;会执行组件内部&#xff0c;再执行组件名上的 父组件 <script setup> import ChildView from ./ChildView.vuefunction onClick()…

18. C++STL 4(vector的使用, 空间增长, 迭代器失效详解)

⭐本篇重点&#xff1a;vector容器的使用详解 ⭐本篇代码&#xff1a;c学习/08.vector_test 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. vector的介绍 二. vector的使用 2.1 vector的定义 * 2.2 vector的迭代器和遍历 a operator[]访问 b vect…

深入探索机器学习性能优化的关键路径——《特征工程训练营》

通过“特征工程”技术&#xff0c;可优化训练数据&#xff0c;提升机器学习流程的输出效果&#xff01;“特征工程”基于现有数据设计相关的输入变量&#xff0c;由此简化训练过程&#xff0c;增强模型性能。调整超参数或模型的效果都不如特征工程&#xff1b;特征工程通过改变…

吉他初学者学习网站搭建系列(8)——如何练习音阶

文章目录 背景实现吉他面板音阶位置音阶识别 结语 背景 大家好&#xff0c;我是一个爱好音乐的非典型程序员&#xff01;我最近又往自己的网站中集成了一个模块——音阶。下面介绍一下背景。 很多吉他初学者在掌握了一些音阶知识后&#xff0c;可能不知道怎么训练自己的对音阶…