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

若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法,系统将不可能把父类里的方法转移到子类中
对于实例变量则不存在这样的现象,即使子类定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量
易错小例子:
这里面也有进一步 对 编译看左边,运行看右边的理解 声明的是 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 三者之间的相互转换、
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
关于包装类使用的面试题目
第一个会输出 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
}
这段代码的输出结果及其原因如下:
i == j
输出false
- 原因:通过
new Integer(1)
显式创建了两个不同的对象。==
比较对象引用地址,由于i
和j
指向堆中不同的对象,结果为false
。m == n
输出true
- 原因:通过自动装箱赋值(
Integer m = 1
),Java 对 -128 到 127 的整数使用缓存(IntegerCache
)。m
和n
指向缓存中的同一个对象,因此==
结果为true
。x == y
输出false
- 原因:数值 128 超出默认缓存范围(-128 到 127),自动装箱时会创建新的
Integer
对象。x
和y
引用不同对象,==
结果为false
。
总结
new 总是创建新的对象,引用不同
自动装箱在缓存范围内复用对象,范围外创建新对象
==比较对象引用 equals()
比较值。
总结
最近一段时间有点摆烂,加上身边的各种事情,学习有些许耽搁,后面还得继续加油,与君共勉!加油!!
借口会一直等着你,但机会不会!