Java学习笔记(七)Java的封装继承和多态

【Java 基础】-- Java 的三大特性:封装、继承和多态 理解并掌握这三大特性,可以帮助开发者编写出更清晰、模块化和高效的 Java 代码。如果你有任何问题或见解,欢迎留言讨论!这三大特性是 Java 代码可维护性、可扩展性和重用性的关键。本文将详细介绍这三大特性,并提供示例代码帮助理解。Java 作为一门面向对象的编程语言(OOP),其核心特性包括。,从而实现代码复用的机制。在 Java 中,封装通常通过。关键字访问父类的属性和方法。在 Java 中,继承通过。Java 的三大特性——是面向对象编程的核心。 阅读详情

1. 封装:隐藏对象的属性和实现细节,仅对外公开接口。

(1)private(私有变量):只能被定义它的类访问。

(2)protected(受保护变量):可以被定义它的类及子孙类直接访问,也可以由同一包中的其他类直接访问。

(3)public(公共变量):可以被任何类进行访问。

(4)package:可以被定义它的类和同一个包中的其他类(包括派生子类)所访问.(包变量在声明时常常省略package关键字),在其他包中的子类则不能访问父类的包变量

/*
public class Singleton {
	//静态的,保留自身的引用
	private static Singleton test = new Singleton();
	
	//必须是私有的构造函数
	private Singleton(){
		
	}
	//公共的静态方法
	public static Singleton getInstance(){
		return test;
	}
}
*/
public class Singleton {
	//静态的,保留自身的引用
	private static Singleton test = null;
	private int size = 512;
	//必须是私有的构造函数
	private Singleton(){
		
	}
	//公共的静态方法
	public static Singleton getInstance(){
		if(test == null){
			test = new Singleton();
		}
		return test;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	
	public static void main(String[] args) {
		Singleton[] singleInstance = new Singleton[5];
		//使用内存中的同一个实例,因此结果均为512
		for(int i=0;i<5;i++){
			singleInstance[i] = Singleton.getInstance();//静态方法直接可以类名.方法
			System.out.println(singleInstance[i].getSize());
		}
		singleInstance[4].setSize(1000);
		for(int i=0;i<5;i++){
			System.out.println(singleInstance[i].getSize());
		}
	}
}
运行结果为:

512
512
512
512
512
1000
1000
1000
1000
1000

2. 继承:

(1)复用其他对象的代码有两种方法:

①. 继承:是由子对象完全继承父对象的数据和操作,"is"的关系。

②. 包含:把一个对象作为另外一个对象的一部分,从而达到复用的目的,"has"的关系。

(2)继承的理解:

①. 继承是类实现可重用性和可扩充性的关键特征,在继承关系下类之间组成网状的层次结构。

②. 继承避免公用代码的重复开发,减少代码的冗余。

③. 通过继承增强一致性,从而减少模块间的接口和界面

(3)单继承(Java支持):子类只能有一个直接父类,多继承(Java不支持):子类可以有多个直接父类。

Java不支持类的多继承,但支持接口的多继承。继承通过关键字extends实现。

构建一个Person类:

public class Person {
	protected String name;
	protected char sex;
	protected int age;
	
	public Person(){
		super();//表示对它的直接父类的构造函数的使用
		System.out.println("父类的构造函数");
	}

	public Person(String name, char sex, int age) {
		//super();
		this.name = name;//this加“.”表示获取本类的使用
		this.sex = sex;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	//添加方法
	public String getDetails(){
		return "这个人是:"+this.name;
	}
}

构造一个继承Person的Student类:

public class Student extends Person{//新增添了两个变量
<span style="white-space:pre">	</span>protected int chinese,math;
	
	public Student(){
		super();//调用父类无参构造函数
		System.out.println("Student类构造函数");
	}
	
	public Student(String name, char sex,int age,int chinese,int math){
		//super(name,sex,age);
		super.name = name;	//通过super调用父类成员变量
		super.sex = sex;
		super.age = age;
		
		this.chinese = chinese;
		this.math = math;
	}
	
	public double average(){
		return (this.chinese+this.math)/2.0;
	}
	
	//方法覆盖
	public String getDetails(){
		return "这个人是:"+this.name+",平均分是:"+this.average();
	}
}


(4)变量隐藏:

在子类对父类的继承中,如果子类与父类的成员变量同名,此时成为子类隐藏(override)了父类的成员变量。子类若要引用父类的同名变量,要用super关键字做前缀加圆点操作符引用,即“super.变量名”。

(5)方法覆盖:

在子类中重写父类的方法,它们的名称,参数以及返回类型完全相同。通过改写方法体来完成不同的功能。注意子类方法不能缩小父类方法的访问权限 。

(6)super关键字:

如果子类调用父类的构造函数,则通过super()调用来实现。

如果子类调用父类的同名方法,则通过super.方法名()来实现。

(7)this关键字:this变量代表对象本身

当类中有两个同名变量,一个属于类的成员变量,而另一个属于某个特定的方法,使用this区分成员变量和局部变量,使用this简化构造函数的调用

引用自身对象的成员变量,引用自身对象的成员方法,调用自身的构造方法--this(参数)


3. Java多态

(1)静态多态:在编译时,就可以被系统识别,也称为静态联编,重载(overload)方法采用静态联编的方法实现方法重载,在一个类中定义多个同名的方法,但这些方法的参数列表必须不一样,即参数的个数不同,或参数类型不同,或参数顺序不同,注意返回类型不能用来区分重载。

(2)动态多态:在编译时不能被系统识别,而是在运行时才被系统识别,也称为动态联编,覆盖(override)方法,抽象方法和接口采用动态联编的方法实现

class sup{//定义一个sup类
	public int x,y;
	sup(int a,int b){
		this.x = a;
		this.y = b;
	}
	
	public void  display(){
		int z = this.x+this.y;
		System.out.println("add="+z);
	}
}

class sub extends sup{//定义的sub类继承sup
	sub(int a,int b){
		super(a,b);//调用父类sup的构造函数
	}
	
	public void  display(){//方法覆盖
		int z = this.x * this.y;
		System.out.println("product="+z);
	}
}

//dispaly在编译时不能被系统识别,而是在运行时才能被识别到
public class ResultDemo extends sub{//ResultDemo继承sub类
	ResultDemo(int x,int y){
		super(x,y);//调用父类sub的构造函数
	}
	
	public static void main(String[] args) {
		sup num1 = new sup(7, 14);
		sub num2 = new sub(7, 14);
		ResultDemo num3 = new ResultDemo(7, 14);
		num1.display();
		num2.display();
		num3.display();
		
		//动态联编运行时会检查num1的内存是sub的实例还是sup的实例
		num1 = num2;
		num1.display();
		
		num1 = num3;
		num1.display();
	}
}

执行结果为:

add=21
product=98
product=98
product=98
product=98

(3)父类和子类对象的转换

①. 自动转换:向上映射都是自动转换

②. 强制类型转换:父类对象转换为子类对象


格式:instanceof 判断前面的对象是否为后面的类的实例

if(父类对象名 instanceof 子类名){

    子类对象名 = (子类名)父类对象名;

}else{

    …

}

class ASuper{
	String s = "calss:A";
}
class BSub extends ASuper{//继承关系
	String s = "class:B";	//变量隐藏
}
public class TypeV {
	public static void main(String[] args) {
		BSub b1,b3;
		ASuper a1,a2,a3;
		
		BSub b2 = new BSub();
		a1 = b2;//向上映射
		a2 = b2;//向上映射
		System.out.println(a1.s);
		System.out.println(a2.s);
		
		b1 = (BSub)a1;//向下映射,静态联编
		System.out.println(b1.s);
		
		a3 = new ASuper();
		//b3 = (BSub)a3;
		
		if(a3 instanceof BSub)
			b2 = (BSub)a3;
		else
			System.out.println("can not be transformed");
	}
}

运行结果 :

calss:A
calss:A
class:B
can not be transformed



封装继承多态 多态意味着“多种形态”,同一个接口或引用可以指向不同类型的对象,使用父类型的对象作为参数,可以接收所有子类对象(这里父类引用具有多种形态)。在运行时根据实际对象类型调用相应的方法。多态分为两种形式,方法重载是编译时多态的例子(静态绑定),而方法重写则是运行时多态的体现(动态绑定)--方法重载是一个类的多态性表现而方法重写是子类与父类的一种多态性表现向上转型实际就是创建一个子类对象,将其当成父类对象来使用。从小范围向大范围的转换语法格式:父类类型 对象名= new子类类型()使用出现的场景。 阅读详情

相关推荐

别再死磕AUTOSAR文档了!手把手教你用ISOLAR-A配置BswM模块(附实战流程图)

本文通过Vector ISOLAR-A工具实战演示AUTOSAR BswM模块的配置流程,帮助工程师快速掌握基础软件模式管理。从环境准备到模式仲裁规则配置,再到动作列表实现,详细讲解每个步骤,并提供常见问题排查和高级优化技巧,大幅提升开发效率。

weixin_42542669的博客 249

java sub函数,请问一下这个Sub子过程与Function函数过程有什么区别?

function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值。Sub 过程与Function 过程的区别:1. Sub 过程定义时无需定义返回值类型,而Function 过程一般需要用“As 数据类型” 定义函数返回值类型。2. Sub 过程中没有对过程名赋值的语句,而Function 过程中...

weixin_32463071的博客 930

PID不够用?试试用ADRC改造你的ArduCopter:从Simulink仿真到SITL测试全记录

本文详细介绍了如何将ADRC(自抗扰控制)算法集成到ArduPilot飞控中,以替代传统PID控制器。通过Simulink建模、参数整定和SITL仿真测试,展示了ADRC在抗扰动能力、响应速度和参数调节复杂度上的优势,特别适合无人机在强风扰动下的稳定控制。

weixin_32349093的博客 273

java 数组 sub_如何在Java中从另一个数组创建子数组?

如何从另一个数组创建子数组?是否有方法从第一个数组中获取索引,例如:methodName(object array, int start, int end)我不想重复制造循环和使我的程序受到影响。我不断出错:0这是我的代码:import java.util.*;public class testing{public static void main(String [] arg){int[] src...

weixin_28914101的博客 2112

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

端侧部署与优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” 与 “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据和高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署与优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1052

java sub_java实现Pub/Sub

jedis 实现Pub/Subredis支持的Pub/Sub消息模式,类似JMS的“topic” 功能,但是这些消息不支持持久化,而且redis的订阅端需要独占链接,消息接收将是阻塞的。Redis 的消息即发即失,sever不会保存消息,如果publish 的消息没有任何client 处于subscribe状态,消息将会丢失,如果client在subscribe时,链接断开后重连,消息将会丢失。j...

weixin_39595320的博客 1810

拆解英飞凌CoolGaN:如何用Silvaco TCAD仿真评估功率GaN HEMT的关键性能(BV、Qg、开关损耗)

本文详细解析了如何使用Silvaco TCAD仿真工具评估英飞凌CoolGaN功率GaN HEMT的关键性能指标,包括击穿电压(BV)、栅电荷(Qg)和开关损耗。通过精确建模极化效应、优化边缘终端结构以及高频开关损耗仿真技术,为功率器件工程师提供了一套完整的'设计-仿真-验证'方法论,助力GaN HEMT在快充、数据中心电源等领域的应用。

weixin_29159995的博客 427

java中的substring()方法

substring  public String substring(int begin,int end)   返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的begin处开始,直到索引end - 1处,因此,该  子字符串的长度为end - begin(字符串是从0开始的)  "hamburger".substring(4,8)  return "urge"  "smil

每天进步一点点 8203

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

利用Dify构建文档内容的分析对比

本次主要做了一些workflow和Agent的应用实现,供大家参考。主要目的是为了进行两个内部报告文件的内容对比,特别是报告中的各类审批表、申请表、推荐表和流程对比,本地数据通过知识库方式分别加载到两个知识库中,编制工作流针对同一个问题进行知识库检索,之后将查询结果进行合并,再一起提交给LLM进行对比,最终将对比分析结果以markdown方式返回显示。主要包括如何构建知识库,如何设计workflow、如何将工作流发布为工具、如何设计提示词、如何在agent中引入前面发布的工具,最终通过agent实现与用户交

hhue2007的专栏 2525

Java 学习笔记·七 —— Java 基础语法·面向对象之封装、多态、继承

面向对象 类与对象 类的生命周期 类的定义与使用 封装、继承、多态

un357951的博客 355

亿图机床采集数据

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大,联网采集不复杂。

若云流风的专栏 2492

Java学习笔记(封装,继承,多态,抽象类,接口)七

封装 1.提高了程序的安全性,保护数据 2.隐藏代码的视线细节 3.统一接口 4.系统可维护性增加

u012028498的专栏 203

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java中的封装,继承和多态(详解)

目录封装继承 封装 所谓的封装就是把类的属性和方法使用private修饰,不允许类的调用者直接访问,我们定义如下一个类,可以看到所有的成员变量和成员方法都使用private修饰了,我们现在来使用一下这个类。 当我们使用的时候编译器给出了下面这样的报错。 告诉我们说是private访问控制,那么这是什么意思呢?我们来看看另外一张图,那么这张图代表这什么呢?在看这张图之前,我们先来看看四者都提到的包,那么包又是什么呢,包可以简单理解为一个文件夹,把类放到放到包里面,也就相当于是专门的文件夹里面,这不是我们说的

JunFengYiHan的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java系列——封装、继承、多态初了解

封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。将类的某些信息隐藏在类的内部,不允许外部程序进行直接的访问调用。通过该类提供的方法来实现对隐藏信息的操作和访问。隐藏对象的信息。留出访问的对外接口。​ 举个比较通俗的例子,比如我们的USB接口。如果我们需要外设且只需要将设备接入USB接口中,而内部是如何工作的,对于使用者来说并不重要。而USB接口就是对外提供的访问接口。

wct040923的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java的封装继承和多态

this在每个类的内部,都有一个隐含的成员变量,该类的类型就是该类的类型,该成员变量的名称是this,this是一个引用,指向自身的对象。this的用法:         1、this调用本类中的属性,也就是类中的成员变量         2、this调用本类中的其他方法         3、this调用本类中的其他构造方法,调用时要放在构造方法的首行面向对象特征之封装(Encapsulation...

dragon901的博客 1万+

封装、继承、多态

面向对象编程(Object-Oriented Programming, OOP)的三大特征是封装、继承和多态,它们共同构成了面向对象编程的基本原则,有助于编写模块化、可维护和可扩展的代码。

m0_74064480的博客 5240

java封装继承多态

java封装继承多态 面向对象 面向对象的三个特征: 封装(Encapsulation); 继承(Inheritance); 多态(Polymorphism)。 我的总结: 面向过程:强调的是具体的功能实现;(执行者) 面向对象:强调的是具备功能的对象。(管理者) 2、类 类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。 类的概...

阿龙Growing的博客 2796

封装、继承和多态

封装就是对类内部的实现细节进行隐藏,然后对类外提供公开的接口。继承其实是父类对子类的共性的抽取, 实现代码的复用。一个引用调用同一个方法,因为这个引用 引用的对象不一样,导致调用这个方法,所表现出来的行为不一样。这种思想就叫做多态。 ...

crazy_xieyi的博客 2468

封装 继承和多态

封装继承和多态 封装 我们在设计程序时,讲究六个字,高内聚,低耦合 封装就是我们对数据进行隐藏,多用于来封装属性,封装方法较少。 记住封装的核心,就是私有(private) 令属性为私有后我们调用不了类里面的属性,所以我们设置一些get方法和set方法来操作私有的属性 get方法,set方法 public int getAge(){ return age; } public void setAge(int age){ this.age = age; } 具体代码应用 设置一个学生类,令其定义的属

weixin_48121041的博客 5450

java之封装,继承,多态

一,前言 ​ 今天总结一下关于Java的三大特性,封装,继承,多态。其实关于三大特性对于从事编程人员来说都是基本的了,毕竟只要接触Java这些都是先要认识的,接下来就系统总结一下。 二,封装 ​ 先来说说特性之一:封装 2.1,什么是封装 ​ 封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。 将类的某些信息隐藏在类的内部,不允许外部程序进行直接的访问调用。 通过该类提供的方法来实现对隐藏信息的操作

qq_42514371的博客 5411

Java 封装、继承、多态的理解

更好的阅读体验:Java封装、继承、多态的理解 1.封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。让使用者知道的才暴露出来,不需要让使用者知道的全部隐藏起来 封装的好处:避免使用者直接操作属性值,隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作,提高程序安全性。 1.1.封装的实现 Java是使用“访问控制符”来控制哪些细节需要封装的,哪些细节需要暴露的。 Java中有4种访问控制符,分别为private,defaul.

持 开源思想,撰 必胜所学,望 勤学者,无难处 5954

C++之对封装、继承、多态的理解

对封装、继承、多态的简单认识和理解。

爱喝橙汁儿的博客 3807

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装、抽象、继承、多态特点 Java面向对象主要有四大特性:封装、抽象、继承和多态。

恰同学少年 7359
上一篇: Java学习笔记(六)static关键字
下一篇: Java学习笔记(八)abstract,final,变量及接口
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值