软件设计之Java入门视频(10)
视频教程来自B站尚硅谷:
尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号
学习内容:
该视频共分为1-717部分
本次内容涉及270-299
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:
- 方法的重写
- super关键字
- 多态性
- instanceof关键字
- ==与equals()的区别
1、方法的重写
定义:在子类中可以根据需要对从
父类中继承来的方法
进行改造,也称为方法的重置、覆盖
。在程序执行时,子类的方法将覆盖父类的方法
结构: 权限修饰符 返回值类型 方法名(形参列表){方法体}
约定:子类中的叫重写的方法
,父类中的叫被重写的方法
规定:
1)子类重写的方法的方法名和形参列表与父类被重写的方法的方法名
和形参列表
相同
2)子类重写的方法的权限修饰符不小于
父类被重写的方法的权限修饰符
特殊情况:子类不能重写父类中声明为private权限的方法
返回值类型:
1)父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
2)父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类(比如父类被重写方法:Object,重写方法可以返回String类型)
3)父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须相同
(double)
4)子类和父类中同名同参数的方法要么都声明为非static
的(考虑重写),要么都声明为static
(不是重写)
2、super关键字
super的使用:调用
属性
和方法
1) 我们可以在子类的方法或构造器中。通过使用"super.属性"
或"super.方法"
的方式,显式的调用父类
中声明的属性或方法。但是,通常情况下,我们习惯省略"super.
2)特殊情况
:当子类和父类中定义了同名的属性
时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
3)特殊情况
:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。
super调用构造器
1)可以在子类的构造器中显式的使用“super(形参列表)”
的方式,调用父类中声明的指定构造器
2)“super(形参列表)”
的使用,必须声明在子类构造器的首行
3)在类的构造器中,针对“this(形参列表)”
和“super(形参列表)”
的方式,只能二选一,不能同时出现
4)在构造器的首行,若未出现“this(形参列表)”
或“super(形参列表)”
,则默认调用的是父类中空参的构造器[默认执行super();]
5)在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”
,调用父类中的结构
子例对象实例化过程
Dog父类是Animal;
Animal父类是Creature;
Creature父类是Object;
在构造dog对象时,构造器始终至少会有一个构造器调用了父类构造器
从结果
上来看:(继承性):
1)子类继承父类以后,就获取了父类中声明的属性或方法
2)创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
从过程
上来看:
1)当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器直到调用了java.lang.0bject类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用。
3、多态性
对象的多态性:父类的引用指向子类的对象
多态的使用:
1)当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----此时父类被重写的方法称为虚拟方法
2)其中,声明的对象
只能调用父类中声明过的方法
多态的使用范围:
多态只适用于方法
不适用于属性
例:假设 父类person与子类man 都有 int id;当 Person p = new Man(); p.id调用的是父类中的id
Person p = new Man(); //Person 是 Man 的父类
p.eat(); //调用的是Man类的同名方法eat
p.walk(); //假设Person类没有walk方法,此语句报错
多态性的使用示例
package test;
public class AnimalTest {
public static void main(String[] args) {
Animal animal = new Animal();
animal.func(new Dog());
}
}
class Animal{
public void eat(){
System.out.println("动物进食");
}
public void shout(){
System.out.println("动物:叫");
}
public void func(Animal animal){ //Animal animal = new Dog();
animal.eat();
animal.shout();
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("汪!");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("妙!");
}
}
方法的重载与重写(从编译和运行的角度)
1)重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。
它们的调用地址在编译期就绑定了
。Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”
;
2)对于多态,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”
。
向下转型与多态
多态中声明的变量只能使用父类中声明的方法,使用
向下转型
可以调用子类特有的属性与方法
Person p1 = new Man();
Man m1 = (Man)p1; //使用强制类型转换
4、instanceof关键字
判断对象a是否是类A的实例。如果是返回true;如果不是,返回false
使用情况
:为了避免在向下转型时出现ClassCastException的异常,在向下转型前
使用该关键字进行判断
子类的实例也是其所有父类的实例
所以 a instanceof A返回true,当类B为类A的父类时, a instanceof B也是返回true
向下转型常见问题
向上转型(Upcasting)
:将子类引用赋给父类引用。例如:Object obj = new Woman();这是安全的,因为子类包含了父类的所有属性和方法。
向下转型(Downcasting):将父类引用赋给子类引用。例如:Person p = (Person)obj;这是有风险的,只有在父类引用实际指向子类对象时才是安全的。
5、==与equals()的区别
== 运算符
1)可以使用在基本数据类型变量
和引用数据类型变量
中
2)如果比较的是基本数据类型变量
,比较两个变量保存的数据
是否相等(不一定类型要相同)
3)如果比较的是引用数据类型变量
,比较两个变量的地址
是否相同
equals()方法的使用
1)是一个方法
,不是运算符
2)只适用于引用数据类型
3)Object类中定义的equals():
public boolean equals(Object obj){
return (this == obj);}
4)像String、Data、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用地址是否相同,而是比较两个对象的实体内容
是否相同
string类型的内容判断要用equals()