(尚硅谷 Java 学习 B 站大学版)Day17 多态练习

Instanceof 关键字


一:引言

不能调用子类特有的方法、属性;

如何才能调用子类特有的属性和方法

向下转型:使用强制类型转换符

Man m1=(Man) p2 注:其中p2 为 Person 类型

使用强转时,可能出现 ClassCastException 异常

二、instanceof 关键字的使用

a instanceof A: 判断对象 a 是否为类 A 的实例。如果是,返回 true,如果不是返回 false

使用场景:为了避免在向下转型时候,避免出现 ClassCastException 异常,我们在向下转型之前,先进行 instanceof 判断,一旦返回 true,就可以向下转型,否则不行

如果 类 B 是类 A 的父类,且a instanceof A 返回 true,则a instanceof B 也返回 true

扫描二维码关注公众号,回复: 17571024 查看本文章

若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中

对于实例变量则不存在这样的现象,即使子类定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量



易错小例子:

IMG_0032

这里面也有进一步 对 编译看左边,运行看右边的理解 声明的是 Base1 所以会调用 Sub1 中 对 Base1 中 add 方法的重写



5-7 Object 类的使用


1、Object 类是所有 Java 类的根父类

2、如果没有显式使用 extends 关键字指明其父类,则默认父类为 java.lang.Object类

3、Object 类中的功能(属性、方法)的通用性

属性:无

方法:equals()/toString()/getClass()/hashCode()/clone()/finalize()/wait()/notify()/notifyall()

4、Object 类只声明一个空参的构造器



面试题 :==和 equals()的区别

==: 运算符

1、可以使用在基本数据类型变量和引用数据类型变量中

2、如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等 (不一定类型要相同)

​ 如果比较的是引用数据类型,贼比较两个对象的地址值是否相等;即两个引用是否指向同一个对象实体


equals() 方法的使用

1、是一个方法,而非运算符

2、只能适用于引用数据类型

补充:== 符号使用时,必须保证符号左右两边的变量类型一致

3、 Object类中的 equals()的定义:

​ public boolean equals(Object obj){

​ return (this == obj);

}

说明:Object 类中定义的 equals()和==作用相同:即比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体

4、像 String、Date、File、包装类等都重写了 Object 类中的 equals()方法。重写以后,比较的是两个对象的“实体内容”是否相同,而非地址值

5、通常情况下,我们自定义的类如果使用 equals()的话,也通常是比较两个对象的实体内容是否相同,那么我们就需要对 Object 里面的equals()方法进行重写

重写的原则:比较两个对象的实体内容是否相同


Object 类中 toString()的使用:

1、当我们输出一个对象的引用时,实际上就是调用当前对象的 toString()

2、Object 类中 toString()的定义

public String toString(){

​ return getClass().getName()+“@”+Interger.toHexString(hashCode());

}

3、像 String、Date、File、包装类等都重写了 Object 类中的 toString() 方法

​ 使得在调用对象的 toString()时,返回“实体内容”信息

4、自定义类也可以重写 toString,调用次方法是,返回对象的“实体内容”



5-8 包装类的使用


Java 中的 JUnit 单元测试

步骤:

1、选中当前工程 -右键选择: build path -add libraries - Junit 4 -下一步

2、创建 java 类,进行单元测试

​ 此时的 Java 类要求: 此类是 public; 此类提供公共的无参的构造器

3、此类中声明单元测试方法

​ 此时的单元测试方法:方法权限是 public,没有返回值,没有形参

4、此单元测试方法上需要声明注解:@Test, 并在单元测试类中导入: import org.junit.Test

5、声明好单元测试方法以后,就可以在方法体内执行相关的代码

6、写完代码之后,左键双击单元测试方法名,右键 run as -JUnit Test

说明:

1、如果执行结果没有任何异常:绿条

2、如果执行结果出现异常,红条


包装类(Wrapper) 的使用:

针对八种基本数据类型定义相应的引用类型–包装类(封装类)

有了类的特点,就可以调用类中的方法,Java 才是真正的面向对象

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character

包装类的使用:

1、java 提供了八种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征

2、掌握的:基本数据类型、包装类、String 三者之间的相互转换、

CleanShot 2025-02-12 at 18.28.47@2x

JDK 5.0 新特性: 自动装箱和自动拆箱

自动装箱: 基本数据类型---->包装类的对象

int num2=10;
Integer in1=num2; //自动装箱

自动拆箱:包装类的对像-----> 基本数据类型

int num3=in1;//自动拆箱  in1 为上面的包装类类型

基本数据类型、包装类----->String类型:

方法一: +“ ”

方法二:调用 String 重载的 valueOf(Xxx xxx)

int num1=10;
String str1=num+"";
  
  float f1=12.3f;
  String str2=String.valueOf(f1);

String 类型----->基本数据类型、包装类 : 调用包装类 parseXxxx()

String str1="123";
int num2= Integer.parseInt(str1);

String str2="true";
boolean b1=Boolean.parseBoolean(str2);

可能会报 NumberFormatException

关于包装类使用的面试题目

CleanShot 2025-02-14 at 07.55.55@2x

第一个会输出 1.0

第一个编译的过程中, Integer 会自动类型提升为 double 的

第二个输出 1


重要的一个例题

public void test(){
    
    
        Integer i=new Integer(1);
        Integer j=new Integer(1);
        System.out.println(i == j); // false
				//Integer 内部定义了IntegerCache缓存,里面保存了从 -128~127 范围的整数。如果我们使用自动装箱的方式,给 Integer 赋值的范围在
  			//—128~127 范围内时,可以直接使用数组中的元素,不用再去 new 了。提高效率
  
        Integer m=1;
        Integer n=1;
        System.out.println(m == n); //true

        Integer x=128;
        Integer y=128;
        System.out.println(x==y); //false
    }

这段代码的输出结果及其原因如下:

  1. i == j 输出 false
    • 原因:通过 new Integer(1) 显式创建了两个不同的对象。== 比较对象引用地址,由于 ij 指向堆中不同的对象,结果为 false
  2. m == n 输出 true
    • 原因:通过自动装箱赋值(Integer m = 1),Java 对 -128 到 127 的整数使用缓存(IntegerCache)。mn 指向缓存中的同一个对象,因此 == 结果为 true
  3. x == y 输出 false
    • 原因:数值 128 超出默认缓存范围(-128 到 127),自动装箱时会创建新的 Integer 对象。xy 引用不同对象,== 结果为 false

总结

new 总是创建新的对象,引用不同

自动装箱在缓存范围内复用对象,范围外创建新对象

==比较对象引用 equals() 比较值。



总结

最近一段时间有点摆烂,加上身边的各种事情,学习有些许耽搁,后面还得继续加油,与君共勉!加油!!
借口会一直等着你,但机会不会!