软件设计之Java入门视频(10)

软件设计之Java入门视频(10)

视频教程来自B站尚硅谷:

尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号

学习内容:

该视频共分为1-717部分
本次内容涉及270-299
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:

  1. 方法的重写
  2. super关键字
  3. 多态性
  4. instanceof关键字
  5. ==与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()

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值