《廖雪峰Java教程》——面向对象基础(1)

参考资料:

  • 面向对象基础 - 廖雪峰的官方网站 (liaoxuefeng.com)

方法

Java 的方法允许定义可变参数

class Group {private String[] names;public void setNames(String... names) {this.names = names;}
}

可变参数代替数组类型的好处有:

  • 可变参数的传参形式更简单:

    Group g = new Group();
    g.setNames("Xiao Ming", "Xiao Hong", "Xiao jun");	// 可变参数
    g.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao jun"});	// 数组参数
    
  • 可变参数可以避免传入 null

基本类型值传递,引用类型引用传递。

构造方法

class Person {private String name = "Unamed";private int age = 10;public Person(String name, int age) {this.name = name;this.age = age;}
}

在Java中,创建对象实例的时候,先初始化字段,例如,int age = 10; 表示字段初始化为 10 ,然后执行构造方法的代码进行初始化。

方法重载

和 C++ 类似

继承

使用 extends 关键字实现继承:

class Person {private String name;private int age;public String getName() {...}public void setName(String name) {...}public int getAge() {...}public void setAge(int age) {...}
}class Student extends Person {// 不要重复name和age字段/方法,// 只需要定义新增score字段/方法:private int score;public int getScore() {}public void setScore(int score) {}
}

在Java中,没有明确写 extends 的类,编译器会自动加上 extends Object ,所以除了 object 类,任何类都会继承自某个类。

Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类

super

super 关键字表示父类:

class Person {protected String name;protected int age;public Person(String name, int age) {this.name = name;this.age = age;}
}class Student extends Person {protected int score;public Student(String name, int age, int score) {this.score = score;}
}

上述代码会编译报错,这是因为在 Java 中,任何 class 的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句 super(); 由于 Person 类没有无参的构造方法,所以编译失败。

我们可以使用 super 显示调用父类的构造方法:

class Student extends Person {protected int score;public Student(String name, int age, int score) {super(name, age); // 调用父类的构造方法Person(String, int)this.score = score;}
}

阻止继承

使用 final 关键字修饰不能被继承的类。

从 Java 15 开始,可以使用 sealedpermits 来明确指定能够继承该 class 的类:

public sealed class Shape permits Rect, Circle, Triangle {...
}

向上转型

可以让父类型的引用变量指向子类型的实例。

向下转型

Person p1 = new Student(); // upcasting, ok
Person p2 = new Person();
Student s1 = (Student) p1; // ok
Student s2 = (Student) p2; // runtime error! ClassCastException!

向下转型能否成功由变量实际所指的类型决定,可以使用 instanceof 加以判断:

Person p = new Person();
System.out.println(p instanceof Person); // true
System.out.println(p instanceof Student); // falseStudent s = new Student();
System.out.println(s instanceof Person); // true
System.out.println(s instanceof Student); // trueStudent n = null;
System.out.println(n instanceof Student); // false

instanceof 实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为 null ,那么对任何 instanceof 的判断都为 false

从 Java 14 开始,判断 instanceof 后可以直接转型为指定变量:

Object obj = "hello";
if (obj instanceof String) {String s = (String) obj;System.out.println(s.toUpperCase());
}// 可以简写为Object obj = "hello";
if (obj instanceof String s) {System.out.println(s.toUpperCase());
}

区分继承和组合

继承是 is 关系,组合是 has 关系。

多态

可以使用 @Override让编译器帮助检查是否进行了正确的覆写:

class Person {public void run() {}
}public class Student extends Person {@Override // Compile error!public void run(String s) {}
}

实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

覆写Object方法

Object 定义了几个重要的方法:

  • toString() :把 instance 输出为 String
  • equals() :判断两个 instance 是否逻辑相等;
  • hashCode() :计算一个 instance 的哈希值。

final

如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为 final

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

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

相关文章

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意:远程调试的代码需要与本地代码一致,远程调试目的是解决本地环境无法支持调试的情况下,解决线上(测试)环境调试问题。 配置启动脚本参数 n…

如何压缩视频大小,怎么压缩视频

在数字化浪潮中,视频已成为我们生活和工作的重要部分。但视频往往伴随着大文件体积,这给存储和分享带来了不少困扰。本文将为您揭秘好用的压缩视频的方法,帮助您轻松减小视频文件大小,提高分享效率! 方法,使…

C++——模拟战争游戏

以下是一个使用C编写的简单模拟战争游戏的示例代码&#xff1a; #include <iostream> #include <vector> #include <random>// 声明一个简单的战士类 class Warrior { public:Warrior(int attackPower) : m_attackPower(attackPower) {}int getAttackPower(…

spring boot 整合 sentinel

注意版本问题 我这是jdk11 、spring boot 2.7.15 、 alibaba-sentinel 2.1.2.RELEASE <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

vue长列表,虚拟滚动

1.新建子组件&#xff0c;将数据传递过去(几万条数据的数组&#xff0c;一次性展示多少条&#xff0c;每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…

[JavaScript]“复杂”的 this

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/140092319 出自【进步*于辰的博客】 参考笔记二&#xff0c;P6.1&#xff1b;笔记三&#xff0c…

【链表】- 两数相加

1. 对应力扣题目连接 两数相加 2. 实现案例代码 public class AddingTwoNumbers {public static void main(String[] args) {// 示例用例 1ListNode l1 new ListNode(2);l1.next new ListNode(4);l1.next.next new ListNode(5);ListNode l2 new ListNode(5);l2.next ne…

【Python爬虫】Python爬取喜马拉雅,爬虫教程!

一、思路设计 &#xff08;1&#xff09;分析网页 在喜马拉雅主页找到自己想要的音频&#xff0c;得到目标URL&#xff1a;https://www.ximalaya.com/qinggan/321787/ 通过分析页面的网络抓包&#xff0c;最终的到一个比较有用的json数据包 通过分析&#xff0c;得到了发送json…

docker部署前端,配置域名和ssl

之前使用80端口部署前端项目后&#xff0c;可以使用IP端口号在公网访问到部署的项目。 进行ICP域名备案后&#xff0c;可以通过域名解析将IP套壳&#xff0c;访问域名直接访问到部署的项目~ 如果使用http协议可以很容易实现这个需求&#xff0c;对nginx.conf文件进行修改&#…

Spring Boot集成DeepLearning4j实现图片数字识别

1.什么是DeepLearning4j&#xff1f; DeepLearning4J&#xff08;DL4J&#xff09;是一套基于Java语言的神经网络工具包&#xff0c;可以构建、定型和部署神经网络。DL4J与Hadoop和Spark集成&#xff0c;支持分布式CPU和GPU&#xff0c;为商业环境&#xff08;而非研究工具目的…

《昇思25天学习打卡营第28天 | 昇思MindSporeVision Transformer图像分类》

第28天 本节学习了Vision Transformer图像分类 ViT则是自然语言处理和计算机视觉两个领域的融合结晶。在不依赖卷积操作的情况下&#xff0c;依然可以在图像分类任务上达到很好的效果。ViT模型的主体结构是基于Transformer模型的Encoder部分&#xff08;部分结构顺序有调整&a…

Mojo: AI开发的革命性编程语言

------------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------------- 刚刚Mojo和HuggingFace一样发布新版本&#xff0c;此版本编号为24.4&#xff0c;包括几个核心语言和标准库增强功能。此版本最大的亮点之一是收到了来自18个社区贡献者的21…

redis布隆过滤器原理及应用场景

目录 原理 应用场景 优点 缺点 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率很高的随机数据结构&#xff0c;它利用位数组和哈希函数来判断一个元素是否存在于集合中。 原理 数据结构&#xff1a; 位数组&#xff1a;一个由0和1组成的数组&#xff0c;初始…

【AI应用探讨】—胶囊神经网络(GNN)应用场景

目录 一、图像识别与分类 二、目标检测与跟踪 三、自然语言处理 四、其他应用场景 一、图像识别与分类 多层次特征捕捉 胶囊网络通过其独特的胶囊结构和动态路由算法&#xff0c;能够捕捉图像中的多层次特征。每个胶囊不仅输出激活强度&#xff0c;还输出一个多维向量&…

Docker Desktop安装mysql

安装 Docker Desktop 1、访问 Docker Desktop 官方下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ &#xff0c; 选择对应平台的 Docker Desktop 安装包点击下载&#xff1a; 2、下载成功后&#xff0c;双击开始安装&#xff1a; 3、安装之前的相关配…

产品经理-对产品经理的认识(1)

今天跟大家聊一下产品经理这个岗位的,产品经理是互联网岗位当中比较火的一个岗位,也是最接近CEO的岗位 产品经理岗位&#xff0c;技术门槛低&#xff0c;薪水和前景都很不错&#xff0c;又处于团队的核心位置 产品经理岗位没有完全相关的专业设置和清晰的学习路径&#xff0c;绝…

Spring Boot中实现多数据源配置

Spring Boot中实现多数据源配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现多数据源配置&#xff0c;以应对复杂…

java框架的落地实践案例:大数据平台设计与实现

使用 java 框架设计和实现大数据平台可为企业提供数据处理和分析解决方案&#xff0c;使之能够做出数据驱动的决策。系统采用微服务架构&#xff0c;分解数据处理任务为松散耦合组件&#xff0c;构建于 spring boot 等 java 框架之上。数据采集通过kafka 进行&#xff0c;数据清…

Rust借助dotenv库读取环境变量

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…