java10基础(this super关键字 重写 final关键字 多态 抽象类)

news2024/11/23 20:54:34

目录

一. this和super关键字

1. this关键字

2. super关键字

二. 重写

三. final关键字

四. 多态

五. 抽象类

1. 抽象方法

2. 抽象类 

3. 面向抽象设计


一. this和super关键字

1. this关键字

this   当前对象的引用

this.属性
this.方法名()
this()  -- 调用构造函数 放在代码第一行

细节:

●可以用this来区分属性和局部变量。

●在类的方法中,我们可以使用this.属性或this.方法的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略this.。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用this.变量的方式,表明此变量是属性,而非形参。
●使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。

调用属性和方法:

class Person{ // 定义Person类
    private String name ;
    private int age ;
    public Person(String name,int age){
      this.name = name ; 
      this.age = age ; }
    public void getInfo(){
      System.out.println("姓名:" + name) ;
      this.speak();
    }
    public void speak(){
      System.out.println(“年龄:” + this.age);
    } 
}

调用构造方法:

●this(形参列表)必须声明在当前构造器的首行

class Person{ // 定义Person类
   private String name ;
   private int age ;
   public Person(){ // 无参构造器
     System.out.println("新对象实例化") ;
   }
   public Person(String name){
     this(); // 调用本类中的无参构造器
     this.name = name ;
   }
   public Person(String name,int age){
     this(name) ; // 调用有一个参数的构造器
     this.age = age;
   }
   public String getInfo(){
     return "姓名:" + name + ",年龄:" + age ;
   } 
}

2. super关键字

super   子类调用父类的内容

super   表示的是超类或者父类的意思

super.属性  调用父类的成员变量
super.方法名() 调用父类的成员方法
super()    调用父类的构造方法

使用:

可以在子类中显示地调用父类的结构。

构造方法里面:
●子类默认调用父类无参构造方法super()

●如果父类没有无参构造,则需要手动使用super(参数)来调用父类的有参构造
●如果显示的写了super(参数),默认的则不赠送
●super()一定是在第一行
●this()必须写在第一行,所以super()和this()不能同时出现

父类:

public class Person {
	protected String name;
	protected int age;
 
	public String getName() {
		return name;
	}
 
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public int getAge() {
		return age;
	}
 
	public void setAge(int age) {
		this.age = age;
	}
 
}

子类:

public class Student extends Person {
	private int score;
 
	public Student() {
		//默认调用父类无参构造方法
		// super();
		//调用父类的有参构造方法
		super("zkt",18);
	}
 
}

二. 重写

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为重写(Override)

语法规则:在子类和父类中有方法名完全一致,返回值类型相同的方法

●发生在子类和父类中,如果父类所提供的方法不能满足子类的需求,则子类可以重写
●方法名相同,参数项相同,返回值也相同,子类的修饰符>=父类的修饰符,方法体不同

   返回值:子类重写的方法的返回值范围可以小于父类的方法的返回值范围

父类:

class Person {
    public void run() {
        System.out.println("Person.run");
    }
}

子类: 在子类Student中,重写这个run()方法

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}


手动重写Object类的方法:

在Java中,所有的class类最终都继承自Object,而Object定义了几个重要的方法

@Override
	public String toString() {
		return "姓名" + name + "身份证号:" + cardId;
	}

	// equals 只能用在引用数据类型上
	// object中的equals方法比较的是两个对象的地址是否相同,String类比较的是内容是否相同(因为其重写了equals方法)
	// 如果自己想要看内容是否相同 重写equals方法
	@Override
	public boolean equals(Object obj) {
		// 1.先比较地址是否相同
		if (this == obj) {
			return true;
		}
		// 2.先判断是否是Person类型
		if (obj instanceof Person) {
			// 向下转型
			Person p1 = (Person) obj;
			return this.name.equals(p1.name) && this.cardId.equals(p1.cardId);
		}
		return false;
	}

	// 地址改成了属性的地址和
	// 如果两个对象的属性完全相同 则hashCode值也完全相同
	@Override
	public int hashCode() {
		return name.hashCode()+cardId.hashCode();
	}

重载:

●方法的重载:在同一个类中,方法名相同,参数项不同(类型,个数,顺序)

●和返回值无关,发生在编译期

区别:

N区别重载重写
1概念方法名称相同,参数的类型及个数不同方法名称、返回值类型、参数的类型及个数完全相同
2范围一个类继承关系
3限制没有权限要求被重写的方法不能拥有比父类更严格的访问控制权限

三. final关键字

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

父类:

public class Fu {
	public final int AGE = 18;
	public final int[] AAA = { 12, 2, 23, 45 };

	public final void eat() {
		System.out.println("这个是父类的eat方法");
	}
}

1.1:final用来修饰字段基本数据类型,常量-值不可变

	//1.1:final用来修饰字段基本数据类型,常量-值不可变
		Fu fu1 =new Fu();
//		fu1.AGE=10;
		System.out.println(fu1.AGE);//18

1.2:final用来修饰字段(引用数据类型)地址不可发生变化,值可以变

fu1.AAA[0]=1000;
		System.out.println(Arrays.toString(fu1.AAA));//[1000, 2, 23, 45]

2.final用来修饰方法,此方法不能重写,此方法可以被子类调用

//2.final用来修饰方法,此方法不能重写,此方法可以被子类调用
		Zi zi  = new Zi();
		zi.eat();//这个是父类的eat方法
class Zi extends Fu{
	// compile error: 不允许覆写
	@Override
	public void eat() {
		System.out.println("这个是子类的eat方法");
	}
}

3.fianl用来修饰类,父类不能被继承,太监类

四. 多态

多态指的是同一对象,在不同时刻表现出来的多种形态

多态实现的三要素:
●有继承关系/实现关系
●有方法的重写
●有父类的引用指向子类,向上转型


示例:

Shape类:

public class Shape {
	public void draw() {
	}
}

子类:

class Circle extends Shape {
	@Override
	public void draw() {
		System.out.println("⭕");
	}
}
class Flower extends Shape {
	@Override
	public void draw() {
		System.out.println("❀");
	}
}
class Star extends Shape {
	@Override
	public void draw() {
		System.out.println("⭐");
	}
}
class Triangle extends Shape {
	@Override
	public void draw() {
		System.out.println("▲");
	}
}
class Square extends Shape {
	@Override
	public void draw() {
		System.out.println("■");
	}
}

不使用多态写法:

public static void main(String[] args) {
		Flower flower = new Flower();
		Star star = new Star();
		Circle circle = new Circle();
		Triangle triangle = new Triangle();
		Square square = new Square();
		String[] shapeStrings = { "flower", "star", "circle", "triangle", "square" };
		// 不使用多态绘制图形
		for (int i = 0; i < shapeStrings.length; i++) {
			if ("flower".equals(shapeStrings[i])) {
				flower.draw();
			} else if ("star".equals(shapeStrings[i])) {
				star.draw();
			} else if ("circle".equals(shapeStrings[i])) {
				circle.draw();
			} else if ("triangle".equals(shapeStrings[i])) {
				triangle.draw();
			} else if ("square".equals(shapeStrings[i])) {
				square.draw();
			}
		}
	}

多态写法:

public static void main(String[] args) {
		Shape[] shapes = {new Flower(),new Star(),new Triangle(),new Square()};
		for (Shape shape : shapes) {
			shape.draw();
		}
	}

多态的写法优点:
●类的调用者对类的使用成本进一步降低,多态是让类的调用者不用知道类的具体类型.
●可以降低圆圈复杂度
●可拓展性增强

多态的写法:

父类 对象名= new 子类() #父类类型指向子类对象   eg: Fu  fu = new Zi()
接口 对象名= new 实现类() #接口类型指向实现类对象

多态中的成员访问特点:见java基础09

●成员变量的访问特点:编译看左边,运行看左边,如果没有则向上查找。

●成员方法的访问特点: 编译看左边,运行看右边,如果没有则向上查找。

多态的优缺点:

优点:父类类型/接口类型作为方法的参数/返回值,提高了程序的扩展性

缺点:无法访问子类/实现类中独有的方法。(需要向下转型)

向上下转型:见java基础09

五. 抽象类

●当一个类被abstract修饰这个类就是抽象类

●在Java中,—个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

1. 抽象方法

抽象方法:
●抽象方法没有方法体
●抽象方法使用abstract关键字来修饰,修饰符和返回值中间
●抽象方法必须写在抽象类中
●抽象方法的修饰符不能是private

public abstract class Shape {
	// 定义了一个"规范"
		public abstract void draw();
}

2. 抽象类 

抽象类:
●抽象类使用abstract关键字来修饰,放在修饰符和class中间
●子类必须要重写抽象类中的抽象方法,除非子类也是抽象类
●抽象类无法实例化对象
●抽象类中成员变量,常量,构造方法(存在的意义,初始化成员变量)

public abstract class Shape {
	public int age;
	public final double PI = 3.14;

	public Shape() {
		this.age = 18;
		System.out.println("这个是父类的无参构造方法");
	}

	// 定义了一个"规范"
	public abstract void draw();

	public void doSth() {
		System.out.println("这个是shape的doSth方法");
	}
}

●子类是抽象类,可以不用实现抽象方法,当然也可以实现抽象方法(如果在此处可以完成)

        

//子类是抽象类,可以不用实现抽象方法,当然也可以实现抽象方法(如果在此处可以完成)
abstract class Circle extends Shape {

}

●子类是普通类,必须要重写父类中的抽象方法

//子类是普通类,必须要重写父类中的抽象方法
class Flower extends Shape {
	public Flower() {
		super();
	}

	@Override
	public void draw() {
		System.out.println("❀");
	}
}

●抽象类不能实例化对象

报错

		Circle c1 =new Circle();//抽象类不能实例化对象
		Shape s1 = new Shape();

子类调用:

Flower f1 = new Flower();
		System.out.println(f1.age);
		f1.doSth();

多态写法:

	Shape s1 = new Flower();//多态写法
		s1.doSth();
		s1.draw();

3. 面向抽象设计

面向抽象设计的本质是:
●上层代码只定义规范(例如:abstract class Person)
●不需要子类就可以实现业务逻辑(正常编译)
●具体的业务逻辑由不同的子类实现,调用者并不关心

public abstract class Person {
	protected String name;

	public Person(String name) {
		super();
		this.name = name;
	}

	// 定义了规范
	public abstract void run();
}
class Student extends Person {

	public Student(String name) {
		super(name);
	}

	@Override
	public void run() {
		System.out.println("学生类"+name+"的run方法");
	}

}
class Teacher extends Person{

	public Teacher(String name) {
		super(name);
	}

	@Override
	public void run() {
		System.out.println("老师类"+name+"的run方法");
	}
	
}

这种引用抽象类的好处在于,我们对其进行方法调用,并不关心Person类型变量的具体子类型:

Person[] persons = { new Student("zkt1"), new Student("zkt2"), new Teacher("zkt3") };
		for (Person person : persons) {
			//在运行的过程中,不必过多关注子类的业务实现,也不必关注子类的具体类型
			person.run();
		}

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

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

相关文章

2024 AI中转计费平台系统源码

简介&#xff1a; 2024 AI中转计费平台系统源码 文件下载https://www.skpan.cn/CNZjzyC4txX 图片&#xff1a;

荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 2 .... ***. ..a. 输出 yes 思路&#xff1a; 根据题意&#xff0c;这里 1 s 可以移动多次&#xff0c;我们将每次可以移动避开雪的的位置存储起来&#xff0c;判断当…

运维开发工程师教程之MongoDB单机版设置

MongoDB单机版设置 一、创建虚拟机 在VMware Workstation软件中新建一个虚拟机&#xff0c;具体操作步骤如下&#xff1a; ①运行VMware Workstation软件&#xff0c;进入到主界面&#xff0c;单击“创建新的虚拟机”来创建新的虚拟机&#xff0c;如图3-1所示。 图3-1 VMware…

3D相机及应用

无论是2D相机和3D相机&#xff0c;在工业应用中都有着不可或缺的作用。3D相机与2D相机的最大区别在于&#xff0c;3D相机可以获取真实世界尺度下的3D信息&#xff0c;而2D相机只能获取像素尺度下的2D平面图像信息。通过3D相机得到的数据&#xff0c;我们可以还原出被测量物体的…

shell脚本脚本变量

shell脚本的概念&#xff1a; 1.讲要执行的命令按顺序保存到一个文本文件 2.给文件可执行权限 3.可以结合各种shell控制语句以完成更复杂的操作 linux中包含shell的文件有 [rootlocalhost ~]# cat /etc/shells /bin/sh #UNIX最初使用的 shell&#xff0c;已经被…

流量暴涨!抖音+快手+小红书获客攻略!

在数字营销的海洋中&#xff0c;抖音、快手和小红书无疑是三座巨大的灯塔&#xff0c;照亮了品牌和个人获取流量的道路。这些平台不仅拥有庞大的用户基础&#xff0c;而且其独特的算法和社交特性让获客变得更加高效而精准。接下来&#xff0c;让我们深入探讨如何通过这三个平台…

鸿蒙OpenHarmony【基于Hi3516DV300开发板(时钟应用开发)】

概述 本文将介绍如何快速搭建基于OpenHarmony标准系统&#xff08;Hi3516DV300开发板&#xff09;的应用开发环境&#xff0c;并基于一个时钟APP示例逐步展示应用的创建、开发、调试和安装等流程。示例代码可以通过本链接获取。 时钟App是一款显示实时时间的应用&#xff0c;…

WouoUIPagePC端实现

WouoUIPagePC端实现 WouoUIPage是一个与硬件平台无关&#xff0c;纯C语言的UI库&#xff08;目前只能应用于128*64的单色OLED屏幕上&#xff0c;后期会改进&#xff0c;支持更多尺寸&#xff09;。因此&#xff0c;我们可以在PC上实现它&#xff0c;本文就以在PC上使用 VScode…

124.反转链表(力扣)

题目描述 代码解决&#xff08;思路1&#xff1a;双指针&#xff09; class Solution { public:ListNode* reverseList(ListNode* head) {ListNode*temp;//保存cur下一个节点ListNode*curhead;ListNode*preNULL;while(cur){tempcur->next;// 保存一下 cur的下一个节点&#…

新的循环体和define

目录 do while讲解 练习&#xff1a; 结果&#xff1a; 分析&#xff1a; 定义&#xff1a;宏&#xff08;define&#xff09; 练习&#xff1a; 结果&#xff1a; 分析&#xff1a; define的优缺点 优点&#xff1a; 缺点&#xff1a; 作业&#xff1a; 大家假期…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取&#xff0c;克隆项目到本地创建分支切换分支将…

使用wxPython和pandas模块生成Excel文件

介绍&#xff1a; 在Python编程中&#xff0c;有时我们需要根据特定的数据生成Excel文件。本文将介绍如何使用wxPython和pandas模块来实现这个目标。我们将创建一个简单的GUI应用程序&#xff0c;允许用户选择输出文件夹和输入的Excel文件&#xff0c;并根据Excel文件中每个单…

代码随想录算法训练营第十八天:二叉树的层序遍历(中间放假)

代码随想录算法训练营第十八天&#xff1a;二叉树的层序遍历&#xff08;中间放假&#xff09; ‍ ​​ 102.二叉树的层序遍历 力扣题目链接(opens new window) 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右…

算法提高之能量项链

算法提高之能量项链 核心思想&#xff1a;区间dp 通过观察发现可以将n个珠子最后的n1个数看作石子 合并石子 在l~r的范围内 找k作隔断 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,M N<<…

【PCB字符批量修改】- PCB板工艺及AD软件配置

软件版本 选择丝印-单机右键&#xff0c;选择find similar objects 第二步单机Apply 第三步选择OK 第四步在Panels中选择Properties里面修改Text Height和Stroke Width 到此搞定&#xff01;

数据结构——链表(精简易懂版)

文章目录 链表概述链表的实现链表的节点&#xff08;单个积木&#xff09;链表的构建直接构建尾插法构建头插法构建 链表的插入 总结 链表概述 1&#xff0c;链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一系列元素。它由一系列节点&…

python实现的信号合成分析系统(DSP)

python实现的信号合成分析系统(DSP) 流程 1、在QT界面上设置好信号频率,采样频率,采样点数 2、使用np构建sin函数 3、使用matplotlib画出 4、分别分析合成信号的FFT频域信息1、效果图 2、示例代码 def btn_com_clicked(self):# 信号合成分析Fs = self.com_fs_edit_value #…

【嵌入式DIY实例】-基于GSM的远程灌溉系统

基于GSM的远程灌溉系统 文章目录 基于GSM的远程灌溉系统1、硬件准备与接线2、软件准备3、代码实现本文将详细介绍如何搭建通过使用手机实现对灌溉系统的远程控制。该系统利用全球移动通信系统(GSM)技术在灌溉系统和移动电话之间建立通信。该系统建立在流行的开源微控制器平台…

重庆大足某厂不锈钢管件酸洗钝化-智渍洁

简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化 重庆大足某厂不锈钢管件酸洗钝化 - 重庆智渍洁环保科技有限公司简报&#xff1a;重庆大足某厂不锈钢管件酸洗钝化https://www.zhizijie.com/hl/zixun/gongsi/237.html

【Linux网络】网络文件共享

目录 一、存储类型 二、FTP文件传输协议 2.1 FTP工作原理 2.2 FTP用户类型 2.3 FTP软件使用 2.3.1 服务端软件vsftpd 2.3.2 客户端软件ftp 2.4 FTP的应用 2.4.1 修改端口号 2.4.2 匿名用户的权限 2.4.3 传输速率 三、NFS 3.1 工作原理 3.2 NFS软件介绍 3.3 NFS配…