Java学习笔记(13)——面向对象编程

面向对象基础

目录

面向对象基础

方法重载

练习:

继承

继承树

protected

super

阻止继承

向上转型

向下转型

区分继承和组合

练习

小结:


方法重载

如果有一系列方法,功能类似,只是参数有所不同,就可以把这字方法名成同名方法:

class Hello {public void hello() {System.out.println("Hello");}public void hello(String name) {System.out.println("Hello " + name);}public void hello(String name,int age) {if(age < 18) {System.out.println("Hi " + name + "!");} else {System.out.println("Hello " + name + "!");}}
}

这种方法名相同,但各自参数不同,称为方法重载(Overload)。

通常,方法重载的返回值类型都是相同的。

举个例子:

String类提供了多个重载方法indexOf(),可以查找子串:

  • int indexOf(int ch):根据字符的Unicode码查找
  • int indexOf(String str):根据字符查找
  • int indexOf(int ch,int fromIndex):指定起始位置,根据字符查找
  • int indexOf(String str,int fromIndex):指定起始位置,根据字符串查找
public class Main {public static void main(String[] args) {String s = "Test string";int n1 = s.indexOf('t');int n2 = s.indexOf("st");int n3 = s.indexOf("st",4);System.out.println(n1);System.out.println(n2);System.out.println(n3);}
}

练习:

public class Main {public static void main(String[] args) {Person ming = new Person();Person hong = new Person();ming.setName("Xiao Ming");hong.setName("Xiao ","Hong");System.out.println(ming.getName());System.out.println(hong.getFirstName() + hong.getSunName());}
}class Person {private String name;private String sunName;private String firstName;public String getName() {return name;}public String getSunName() {return sunName;}public String getFirstName() {return firstName;}public void setName(String name) {this.name = name;}public void setName(String fitstName,String sunName) {this.firstName = fitstName;this.sunName = sunName;}
}

继承

若要定义一个类,这个类包含了已有类的字段和方法,只是增加了一些字段和方法,可以用继承从而在这个类中不写重复代码。

继承是面向对象编程中非常强大的一种机制,可以复用代码,只需要为新的类编写新增功能即可。

Java用extends关键字来实现继承:

class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Student extends Person {private int score;public void getScore(int score) {this.score = score;}
}

子类自动获得了父类所有字段,严禁定义与父类重名的字段。

在OOP的术语中,把Person成为超类,基类,父类;把Student成为子类,扩展类

继承树

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

protected

继承的特点:子类无法访问父类的private字段或者private方法。所以下面例子中Student无法访问Person的name字段和age字段:

class Person {private String name;private int age;
}class Student extends Person {public String hello() {return "Hello," + name;//会编译错误}
}

为了让子类可以访问父类的字段,要把private改为protected。用protected修饰的字段可以被子类访问。

class Person {protected String name;protected int age;
}class Student extends Person {public String hello() {return "Hello," +name;//可以正常编译}
}

以上,protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类、子类的子类访问。

super

表示父类(超类)。子类引用父类的字段时,可以用super.fieldName。例如:

class Student extends Person {public String hello() {return "Hello," + super.name;}
}

这里使用super.name或者this.name效果一致,编译器会自动定位到父类的name字段。

但是,在某些情况,必须使用super,如:

public class Main {public static void main(String[] args) {Student s = new Student("Xiao Ming",12,89);}
}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;}
}

编译错误为:在Student的构造方法中,无法调用Person的构造方法。

在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法,编译器会自动加一个super·();所以,Student类的构造方法实际是这样:

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

由于Person类并没有无参数的构造方法,所以编译失败,可以调用Person存在的某个构造方法,如:

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

结论:如果父类没有默认构造方法,子类就必须显示调用super()并给出参数以便编译器定位到父类的一个合适的构造方法。子类不会继承父类的任何构造方法,子类默认的构造方法是编译器自动生成的,而不是继承的。

阻止继承

正常情况下,只要某个类没有final修饰符,那么任何类都可以从该class继承。用sealed修饰class,并通过permits明确写出能够从该class类继承的子类名称。

比如定义一个Shape类:

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

这就是一个sealed类,只允许指定的3个类继承它,

public final class Rect extends Shape{...}
// 没问题,因为Rect出现在Shape的permits列表中
// 但是,如果定义一个Ellipse就会报错
// 因为Ellipse并未出现在Shape的permits列表中。
public final class Sllipse extends Shape {...}
// Compile error: class is not allowed to extend sealed class: Shape

这种sealed类主要用于一些框架,防止继承被滥用。

sealed在Java15中目前是预览状态,要启用它必须使用参数--enable-preview和--source15

向上转型

如果Student是Person继承下来的,那么,一个引用类型为Person的变量,可以指向Student。Student拥有父类Person所有功能,Person类型的变量可以指向Student类型的实例。

Person p = new Student();

这种把一个子类类型安全的变为父类类型的赋值,被称为向上转型(upcasting)

Student s = new Student();
Person p = s;// upcasting,ok
Object o1 = p;// upcasting,ok
Object o2 = s;// upcasting,ok

继承树为:Student > Person > Object,所以,可以把Student类型转为Person或Object

向下转型

如果一个父类类型强制转为子类类型,就是向下转型(downcasting)

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

为了避免向下转型出现错误Java提供了instanceof操作符,可以先判断一个实例究竟是不是某种类型。

Person p = new Person();
System.out.println(p instancaof Person);// true
System,out.ptintln(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);ture

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

利用instanceof,在向下转型前可以先判断:

Person p = new Student();
if (p instanceof Student) {// 只有判断成功才会向下转型Student s = (Student) p;
}

从Java14开始,判断instanceof后,可以直接转型为指定变量,避免再次强制转型。

Object obj = "hello";
if (obj instanceof String) {String s = (String) obj;System.out.println(s.toUpperCase());
}
// 可以改写为:
public class Main {public static void main(String[] args) {Object obj = "hello";if(obj instanceof String s) {// 直接使用变量sSystem.out.println(s.yoUpperCase());}}
}

区分继承和组合

is关系用继承,has关系用组合:

class Student extends Person {protected Book book;protected int score;
}

练习

public class Main {public static void main(String[] args) {Person p = new Person("小明",12);Student s = new Student("小红",29,99);Student ps = new PrimaryStudent("小军",9,100,5);System.out.println(ps.getScore());}
}class Person {protected String name;protected int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Student extends Person {protected int score;public Student(String name, int age, int score) {super(name, age);this.score = score;}public int getScore() {return score;}
}class PrimaryStudent extends Student {protected int grade;public PrimaryStudent(String name, int age, int score, int grade) {super(name, age, score);}
}

小结:

继承是面向对象编程的一种强大的代码复用方式。

只允许单继承,所有类最终的根类是Object

protected允许子类访问父类的字段和方法

子类的构造方法可以通过super()调用父类的构造方法

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

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

相关文章

线性池学习

一、什么是进程&#xff1f;什么是线程&#xff1f; 1. 进程的定义 从操作系统的角度解释&#xff1a; 进程是操作系统分配资源和调度执行的基本单位。每个进程都是操作系统中一个独立的实体&#xff0c;拥有自己的内存空间、文件描述符、代码、数据等资源。进程是程序在执行…

go 自己写序列化函数不转义

以map[int32]string转化为[]byte为例 背景&#xff1a;算法传给我一个map[int32]string类型的值&#xff08;map的值本身是json转化成的string&#xff09;&#xff0c;我需要把这个值生成一个文件上传到OSS&#xff0c;但是发现通过url下载下来的文件里面有转义字符。 原因&a…

Facebook 与数字社交的未来走向

随着数字技术的飞速发展&#xff0c;社交平台的角色和形式也在不断演变。作为全球最大社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在推动数字社交的进程中扮演了至关重要的角色。然而&#xff0c;随着互联网的去中心化趋势和新技术的崛起&#xff0c;Face…

QT:QDEBUG输出重定向和命令行参数QCommandLineParser

qInstallMessageHandler函数简介 QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) qInstallMessageHandler 是 Qt 框架中的一个函数&#xff0c;用于安装一个全局的消息处理函数&#xff0c;以替代默认的消息输出机制。这个函数允许开发者自定义 Qt 应用…

面试小札:Java后端闪电五连鞭_8

1. Kafka消息模型及其组成部分 - 消息&#xff08;Message&#xff09;&#xff1a;是Kafka中最基本的数据单元。消息包含一个键&#xff08;key&#xff09;、一个值&#xff08;value&#xff09;和一个时间戳&#xff08;timestamp&#xff09;。键可以用于对消息进行分区等…

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II

题目&#xff1a; 解析&#xff1a; 这题设计递归函数&#xff0c;主要把看如何剪枝 代码&#xff1a; class Solution {private List<List<Integer>> ret;private List<Integer> path;private boolean[] check;public List<List<Integer>> p…

Python如何正确解决reCaptcha验证码(9)

前言 本文是该专栏的第73篇,后面会持续分享python爬虫干货知识,记得关注。 我们在处理某些国内外平台项目的时候,相信很多同学或多或少都见过,如下图所示的reCaptcha验证码。 而本文,笔者将重点来介绍在实战项目中,遇到上述中的“reCaptcha验证码”,如何正确去处理并解…

【Python函数】对 LEGB 规则以及 nonlocal 和 global 语法的掌握

def outter():def innerA():x 100def innerB():nonlocal xx 250def innerC():global xx 520x 880innerA()print(f"调用完 innerA() 函数之后&#xff0c;x {x}")innerB()print(f"调用完 innerB() 函数之后&#xff0c;x {x}")innerC()print(f"调…

java_零钱通项目

SmallChangeSysOOP.java package com.hspedu.smallchange.oop;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;/*** 该类是完成零钱通的各个功能的类* 使用OOP(面向对象编程&#xff09;*/ public class SmallChangeSysOOP {// 定义相关…

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda&#xff0c;它是conda的C重新实现&#xff0c;使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度&#xff0c;同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…

网络多层的协议详述

网络层 1&#xff09;地址管理&#xff1a;制定一系列的规则&#xff0c;通过地址&#xff0c;在网络上描述出一个设备的位置 2&#xff09;路由选择&#xff1a;网络环境比较复杂&#xff0c;从一个节点到另一个节点&#xff0c;存在很多条不同的路径&#xff0c;需要规划出…

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…

《算法ZUC》题目

判断题 ZUC算法LFSR部分产生的二元序列具有很低的线性复杂度。 A.正确 B.错误 正确答案A 单项选择题 ZUC算法驱动部分LFSR的抽头位置不包括&#xff08; &#xff09;。 A.s15 B.s10 C.s7 D.s0 正确答案C 单项选择题 ZUC算法比特重组BR层主要使用了软件实现友好的…

交换机vlan划分以及端口隔离

vlan 1、基于接口划分vlan 2、基于mac地址划分vlan (接口最好设置为hybird&#xff0c;如果是access和trunk的话&#xff0c;当mac地址匹配到的vlan跟接口的pvid不一致时&#xff0c;不允许通过&#xff1b;而hybird口可以很好的支持多个vlan去除tag后直连设备) #在vlan视…

Flink SQL 从一个SOURCE 写入多个Sink端实例

一. 背景 FLINK 任务从一个数据源读取数据, 写入多个sink端. 二. 官方实例 写入多个Sink语句时&#xff0c;需要以BEGIN STATEMENT SET;开头&#xff0c;以END;结尾。--源表 CREATE TEMPORARY TABLE datagen_source (name VARCHAR,score BIGINT ) WITH (connector datagen …

.vscode配置文件备份

vscode插件 位于&#xff1a;C:\Users\用户名\AppData\Roaming\Code\User\settings.json settings.json {// "C_Cpp.intelliSenseEngine": "default",//智能查找默认值"C_Cpp.intelliSenseEngineFallback": "enabled", //需要添加的…

(Image Signal Processor)ISP简介

文章目录 ISP功能简介ISP的主要功能ISP的主要模块1. **黑电平校正&#xff08;Black Level Correction, BLC&#xff09;**2. **噪声去除&#xff08;Denoise&#xff09;**3. **色彩校正&#xff08;Color Correction Matrix, CCM&#xff09;**4. **自动曝光&#xff08;Auto…

代码随想录day23 | leetcode 39.组合总和 40.组合总和II

39.组合总和 Java class Solution { List<List<Integer>> result new ArrayList<>();LinkedList<Integer> path new LinkedList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sor…

将HTML转换为PDF:使用Spire.Doc的详细指南

目录 引言 1. 为什么选择 Spire.Doc&#xff1f; 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…

jmeter监控服务器性能信息

概述 Apache JMeter 是一个功能强大的开源工具,主要用于进行压力测试和性能测试。除了用于模拟用户行为进行压力测试外,JMeter 还提供了一些功能来监控服务器性能。 性能测试时我们关注的重要指标是:并发用户数,TPS,请求成功率,响应时间,服务器的CPU,memory, l/0 dis…