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,一经查实,立即删除!

相关文章

Facebook 与数字社交的未来走向

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

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

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

穷举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验证码”,如何正确去处理并解…

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;需要规划出…

《算法ZUC》题目

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

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", //需要添加的…

关于Buildroot如何配置qtwebengine [未能成功编译]

目录 前言 下载Buildroot 如何添加qtwebengine 开始make编译 编译过程中到了这些问题 前言 问题的开始就在于学习QT的过程中遇到了一个问题… Unknown module(s) in QT: webenginewidgets 我想要把qt的一个项目编译并发送到我的开发板上&#xff0c;但是qmake识别不到这…

SNP与Scheer合作助力Warsteiner Brauerei成功升级至SAP S/4HANA

德国软件和咨询公司SNP是SAP环境中数字化转型、自动化数据迁移和数据管理软件的知名提供商&#xff0c;再次与德国Scheer公司合作&#xff0c;Scheer公司是一家专门从事业务流程管理和SAP咨询的咨询公司。他们为家族企业Warsteiner Brauerei Haus Cramer KG向SAP S/4HANA升级转…

【Super Tilemap Editor使用详解】(五):图块调色板

1、图块调色板&#xff08;Tile Palette&#xff09;可以在以下位置找到&#xff1a; Tileset Inspector检视面板 STETilemap Inspector检视面板&#xff0c;并选择 "Paint" 选项卡 Tile Palette 窗口&#xff1a;"SuperTilemapEditor/Window/Tile Palette Win…

LNMP+discuz论坛

0.准备 文章目录 0.准备1.nginx2.mysql2.1 mysql82.2 mysql5.7 3.php4.测试php访问mysql5.部署 Discuz6.其他 yum源&#xff1a; # 没有wget&#xff0c;用这个 # curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo[rootlocalhost ~]#…

TRELLIS,一键生成3D模型,图像转3D,微软开源

大家好&#xff01;今天给大家分享微软最近开源的一个3D模型生成项目——TRELLIS。简单来说就是输入一张图片&#xff0c;它就能自动帮你生成3D模型。这与之前分享的TripoSR项目类似&#xff0c;但是精度和贴图细节比TripoSR要高很多。 好久没关注AI生成3D模型这块&#xff0c;…

开源架构学习指南:文档与资源的智慧锦囊

开源架构学习指南&#xff1a;文档与资源的智慧锦囊 一、引言二、开源架构文档的核心价值剖析&#xff08;一&#xff09;知识传承与共享&#xff1a;智慧的薪火相传1. 经典案例&#xff1a;Linux 内核文档 —— 开源世界的智慧基石 &#xff08;二&#xff09;促进协作与沟通&…

景联文科技:精准语音标注,驱动语音技术新发展

在人工智能迅速发展的今天&#xff0c;语音技术的应用已经渗透到我们生活的方方面面。从智能音箱、语音助手到自动语音识别系统&#xff0c;高质量的语音数据是这些应用成功的关键。景联文科技作为领先的AI数据服务提供商&#xff0c;专注于为客户提供高精度、高效的语音标注服…

HTTP接口报错详解与解决 200,500,403,408,404

前言&#xff1a; 仅做学习记录&#xff0c;侵删 背景 当后端编写接口时&#xff0c;经常需要对接口使用ApiFox或者PostMan进行测试&#xff0c;此时就会出现各种各样的报错&#xff0c;一般都会包括报错编码&#xff1a;200,400,401等。这个状态码一般是服务器所返回的包含…

NVIDIA发布紧凑型生成式AI超级计算机:性能提升,价格更低

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

upload-labs(1-19关)通关攻略

Pass-01 本关思路&#xff1a;删除前端js校验 进入第一关环境 桌面新建一个php文件&#xff0c;命名为1.php <?php eval($_POST[a]);?> 我们上传此文件&#xff0c;发现不允许上传&#xff0c;且页面没有变化&#xff0c;说明前端进行了拦截 这时我们打开 F12 &…