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 {@Overridepublic void run() {System.out.println("Student.run");}
}


手动重写Object类的方法:

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

@Overridepublic String toString() {return "姓名" + name + "身份证号:" + cardId;}// equals 只能用在引用数据类型上// object中的equals方法比较的是两个对象的地址是否相同,String类比较的是内容是否相同(因为其重写了equals方法)// 如果自己想要看内容是否相同 重写equals方法@Overridepublic 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值也完全相同@Overridepublic 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: 不允许覆写@Overridepublic void eat() {System.out.println("这个是子类的eat方法");}
}

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

四. 多态

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

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


示例:

Shape类:

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

子类:

class Circle extends Shape {@Overridepublic void draw() {System.out.println("⭕");}
}
class Flower extends Shape {@Overridepublic void draw() {System.out.println("❀");}
}
class Star extends Shape {@Overridepublic void draw() {System.out.println("⭐");}
}
class Triangle extends Shape {@Overridepublic void draw() {System.out.println("▲");}
}
class Square extends Shape {@Overridepublic 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();}@Overridepublic 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);}@Overridepublic void run() {System.out.println("学生类"+name+"的run方法");}}
class Teacher extends Person{public Teacher(String name) {super(name);}@Overridepublic 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.hqwc.cn/news/675518.html

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

相关文章

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址&#xff1a;Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址&#xff1a;infinilabs/analysis-ik: &#x1f68c; The IK Analysis plugin integrates Lucene IK…

【容器】k8s获取的节点oom事件并输出到node事件

在debug k8s node不可用过程中&#xff0c;有可能会看到: System OOM encountered, victim process: xx为了搞清楚oom事件是什么&#xff0c;以及如何产生的&#xff0c;我们做了一定探索&#xff0c;并输出了下面的信息。&#xff08;本文关注oom事件是如何生成&传输的&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<…

2024/5/7 QTday2

练习&#xff1a;优化登录框&#xff0c;输入完用户名和密码后&#xff0c;点击登录&#xff0c;判断账户是否为 Admin 密码 为123456&#xff0c;如果判断成功&#xff0c;则输出登录成功&#xff0c;并关闭整个登录界面&#xff0c;如果登录失败&#xff0c;则提示登录失败&a…

【一看就懂】UART、IIC、SPI、CAN四种通讯协议对比介绍

UART、IIC、SPI、CAN四种通信协议对比 通信方式传输线通讯方式标准传输速度使用场景UARTTX(发送数据线)、RX(接收数据线)串行、异步、全双工115.2 kbit/s(常用)计算机和外部设备通信&#xff08;打印机&#xff09;IICSCL(时钟线)、SDA(数据线)串行、同步、半双工100 kbit/s(标…

文字转语音粤语怎么转换?6个软件教你快速进行文字转换语音

文字转语音粤语怎么转换&#xff1f;6个软件教你快速进行文字转换语音 当需要将文字转换为粤语语音时&#xff0c;可以使用多种工具和服务&#xff0c;这些工具可以帮助您快速而准确地实现这一目标。以下是六个非国内的语音转换软件&#xff0c;它们可以帮助您将文字转换为粤语…

FPGA学习笔记(3)——正点原子ZYNQ7000简介

1 ZYNQ-7000简介 ZYNQ 是由两个主要部分组成的&#xff1a;一个由双核 ARM Cortex-A9 为核心构成的处理系统&#xff08;PS&#xff0c;Processing System&#xff09;&#xff0c;和一个等价于一片 FPGA 的可编程逻辑&#xff08;PL&#xff0c;Programmable Logic&#xff0…

Linux 进程间通信之共享内存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; ​ 目录 ​编辑​ 前言 共享内存直接原理…

Mac虚拟机软件哪个好用 mac虚拟机parallels desktop有什么用 Mac装虚拟机的利与弊 mac装虚拟机对电脑有损害吗

随着多系统使用需求的升温&#xff0c;虚拟机的使用也变得越来越普遍。虚拟机可以用于创建各种不同的系统&#xff0c;并按照要求设定所需的系统环境。另外&#xff0c;虚拟机在Mac电脑的跨系统使用以及测试软件系统兼容性等领域应用也越来越广泛。 一、Mac系统和虚拟机的区别 …

spring高级篇(七)

1、异常处理 在DispatcherServlet中&#xff0c;doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理&#xff1a; 在捕获到异常后没有立刻进行处理&#xff0c;而是先用一个局部变量dispatchException进行记录&#xff0c;然后统一由…

Linux设置脚本任意位置执行

记得备份 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 修改文件之后记得用 source 文件名 刷新 注意&#xff1a;刷新文件之后在当前窗口…

STC89C52驱动XPT2046AD转换

目录 简介封装接线&#xff08;单端&#xff09;时序以及命令字SPI时序命令字 程序XPT2046.CXPT2046.hmain.c测试 简介 XPT2046是一款4线电阻式触摸屏控制器&#xff0c;采用12位125 kHz采样SAR类型A / D转换器。XPT2046工作电压低至2.2V&#xff0c;支持1.5V至VCC的数字I/O接…