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

目录

一. 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();
		}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电源功率模组: 完整的设计和验证流程解决四个维度的设计挑战

概述 电动汽车、新能源、光伏、风电等领域广泛使用高功率开关电源功率模组。IGBT和MOSFET是模组中常用器件。本文讨论这些技术&#xff0c;以及为实现高达1700伏特电压、1600安培电流、温度稳定和低电磁辐射的复杂指标带来的设计挑战。本文也总结今天的设计方法和优缺点。最后…

Java毕业设计 基于SpringBoot vue企业信息管理系统

Java毕业设计 基于SpringBoot vue企业信息管理系统 SpringBoot 企业信息管理系统 功能介绍 员工&#xff1a;登录 个人中心 修改密码 个人信息 会议管理 公告管理 个人计划管理 通讯录管理 外出登记管理 请假管理 上下班打卡管理 管理员&#xff1a;登录 个人中心 修改密码 …

跨越语言界限,多语言盲盒小程序带你领略全球风情

在全球化的今天&#xff0c;我们生活在一个多元文化的世界中&#xff0c;不同的语言、风俗、习惯共同构成了这个五彩斑斓的地球村。为了让每个人都能轻松体验到世界各地的独特风情&#xff0c;一款创新的多语言盲盒小程序应运而生&#xff0c;它跨越了语言的界限&#xff0c;让…

【linux-IMX6ULL中断配置流程】

目录 1. Cortex-A7和GIC中断概述1. 1 Cortex-A7中断系统&#xff1a;1. 2 GIC中断控制器简介&#xff1a; 2. 中断配置概述3. 底层中断文件配置3.1 对启动文件.s的配置思路3.2 对中断函数配置思路 4. 上层中断配置流程 1. Cortex-A7和GIC中断概述 学习IMX6UL的中断处理系统&…

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下&#xff0c;uiotos.net&#xff0c;通过连线来代替脚本逻辑开发&#xff0c;复杂的交互界面&#xff0c;通过页面嵌套轻松解决&#xff0c;是个很新颖的思路&#xff0c;前端零代码&#xff01; 蓝图连线尤其是独创的页面嵌套和属性继承技术&#xff0c;好家…

独有病眼花,春风吹不落。 (二维坐标压缩成一个点,并查集)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 8 1 1 D 1 1 R 1 2 D 2 1 D 2 2 R 3 1 R 3 2 R 2 3 D 输出 8 思路&#xff1a; 根据题意&#xff0c;要求连接线段后&#xff0c;操作多少次&#xff0c;连接的线段闭合&…

javaweb学习笔记1

1、基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站&#xff1b; 提供给所有人看的数据始终会发生变化&…

00后设计师如何通过咸鱼接单实现副业月入过万?

大家好&#xff0c;我是一个00后&#xff0c;拥有6年设计经验的平面/包装/品牌设计师。在裸辞探索自由职业的过程中&#xff0c;误打误撞地通过咸鱼接单做副业&#xff0c;首月收入竟然超过了万元&#xff01;在这里&#xff0c;我将分享具体的实操经验、心得体会以及一些额外的…

c++游戏小技巧16:实例1(地牢生成算法)

1.前言 (头图) &#xff08;其实最开始是想写恶魔轮盘的&#xff0c;但没想到它竟然更新了&#xff09; &#xff08;等我有时间在更&#xff0c;最近很忙&#xff0c;玩第五玩的&#xff09; 想法来源&#xff1a;房间和迷宫&#xff1a;一个地牢生成算法https://indienova…

【牛客】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…

MIT加州理工等革命性KAN破记录,发现数学定理碾压DeepMind!KAN论文解读

KAN的数学原理 如果f是有界域上的多元连续函数&#xff0c;那么f可以被写成关于单个变量和加法二元操作的连续函数的有限组合。更具体地说&#xff0c;对于光滑函数f&#xff1a;[0, 1]ⁿ → R&#xff0c;有 f ( x ) f ( x 1 , … , x n ) ∑ q 1 2 n 1 Φ q ∑ p 1 n …

解决Pyppeteer下载chromium慢或者失败的问题[INFO] Starting Chromium download.

文章目录 1.进入网址2.选择上面对应自己系统的文件夹进去3. 然后找到自己的python环境中的site-packages中pyppeteer中的chromium_downloader.py文件并打开 在首次使用Pyppeteer时需要下载chromium 1.进入网址 https://registry.npmmirror.com/binary.html?pathchromium-bro…

贪心算法应用例题

最优装载问题 #include <stdio.h> #include <algorithm>//排序int main() {int data[] { 8,20,5,80,3,420,14,330,70 };//物体重量int max 500;//船容最大总重量int count sizeof(data) / sizeof(data[0]);//物体数量std::sort(data, data count);//排序,排完数…

品高虚拟化后端存储的发展演进

在品高虚拟化技术不断发展的过程中&#xff0c;虚拟化的后端存储一直是关注的焦点之一。 本文将从最初的文件存储和NFS开始&#xff0c;追溯到集中式存储SAN&#xff0c;然后选择了Ceph的RBD方式&#xff0c;并最终抵达选择支持vhost协议的后端存储的现状&#xff0c;我们将探…

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

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

图像处理技术与应用(四)

图像处理技术与应用入门 颜色空间及其转换 颜色空间是一种用于在数字图像中表达和指定颜色的方法。不同的颜色空间使用不同的方式来定义颜色&#xff0c;每种方式都有其特定的用途和优势。以下是一些常见的颜色空间及其特点&#xff1a; RGB&#xff08;红绿蓝&#xff09;&a…

每日一题(PTAL2):列车调度--贪心+二分

选择去维护一个最小区间 代码1&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int num;vector <int> v;int res0;for(int i0;i<n;i){cin>>num;int locv.size();int left0;int rightv.size()-1;while(left<…

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么&#xff1f;基于AIGC原理以及技术更迭的思考 前言 AI&#xff0c;这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物&#xff0c;更有意思的是&#xff0c;出现频率仅次于这个词的&#xff0c;几乎都会加上一个修饰亦或是前缀——AI&#…

快速排序找出第K大的元素

有序数组里第 K 大的元素就是index 为 array.length - k 的元素。 快速排序的思路主要就是选一个基准值p&#xff0c;然后将小于p的值放在p的左右&#xff0c;大于p的值放在p的右边&#xff0c;然后对左右数组进行递归。 利用这个思路&#xff0c;当我们找到这个基准值对应的 i…

【教学类-50-14】20240505“数一数”图片样式12:数一数(12个“人物”图案)

作品展示 背景需求&#xff1a; 前文做了“”材料”图片的数一数学具&#xff0c;效果不错&#xff0c; https://blog.csdn.net/reasonsummer/article/details/138466325https://blog.csdn.net/reasonsummer/article/details/138466325 为了让图案内容更丰富&#xff0c;我又…