每日一考
多态性:父类的引用指向子类的对象
虚拟方法调用:编译看左,运行看右
一个类可以有一个直接父类
一个父类可以有多个子类
子类能获取直接父类的父类中的结构
子类能获取父类中private权限的属性或方法
方法名、参数列表相同
子类方法权限小于等于父类方法
子类的返回类型必须是父类方法返回类型的子类或与其相同
须放在构造器的首行
参数列表和父类中定义的相同
复习
day12的学习内容
Man是Person的子类,Person person = new Man()
person不能调用Man中有而Person类没有的方法,此时若需调用需要强制类型转换(向下转型)Man man = (Man) person
向上转型就是多态
强制类型转换会出现问题,可能会报错java.lang.ClassCastException
这是由转换类型错误造成的
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false
为了避免在向下转型时出现java.lang.ClassCastException
的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型
package com.atguigu.exer;
//考查多态的笔试题目:
public class InterviewTest1 {
public static void main(String[] args) {
Base1 base = new Sub1();
base.add(1, 2, 3); // sub_1
Sub1 s = (Sub1) base;
s.add(1, 2, 3); // sub_2
}
}
class Base1 {
public void add(int a, int... arr) {
System.out.println("base1");
}
}
class Sub1 extends Base1 {
public void add(int a, int[] arr) {
System.out.println("sub_1");
}
public void add(int a, int b, int c) {
System.out.println("sub_2");
}
}
base开始的时候只能调用Base1类中有的方法(编译看左),只有两种可能(输出sub_1或者编译过不了),如果认为输出base1建议多看看多态;在这里认为子类中的方法重写了父类中的方法
一、== :运算符
二、equals()方法的使用:
3. 是一个方法,而非运算符
4. 只能适用于引用数据类型
5. Object类中equals()的定义:
public boolean equals(Object obj) {
return (this =\= obj);
}
说明:```Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同;即两个引用是否指向同一个对象实体```
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们 就需要对Object类中的equals()进行重写。
重写的原则:比较两个对象的实体内容是否相同。
当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
Object类中toString()的定义:
publicString toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
像String、Date、File、包装类等都重写了Object类中的toString()方法。
使得在调用对象的toString()时,返回"实体内容"信息
自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
int i = 500;
Integer t = new Integer(i);
Float f = new Float(“4.56”);
boolean b = bObj.booleanValue();
JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配
@Test
public void test3() {
int num1 = 10;
// 基本数据类型-->包装类的对象
method(num1);
// 自动装箱:基本数据类型 --->包装类
int num2 = 10;
Integer in1 = num2;// 自动装箱
boolean b1 = true;
Boolean b2 = b1;// 自动装箱
// 自动拆箱:包装类--->基本数据类型
System.out.println(in1.toString());
int num3 = in1;// 自动拆箱
}
包装类和字符串相互转化
//String类型 --->基本数据类型、包装类:调用包装类的parseXxx(String s)
@Test
public void test5(){
String str1 = "123";
int num2 = Integer.parseInt(str1);
System.out.println(num2 + 1);
String str2 = "true1";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1);
}
//基本数据类型、包装类--->String类型:调用String重载的valueOf(Xxx xxx)
@Test
public void test4(){
int num1 = 10;
//方式1:连接运算
String str1 = num1 + "";
//方式2:调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);//"12.3"
}
包装类经典题目
@Test
public void test3() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true
Integer x = 128;//相当于new了一个Integer对象
Integer y = 128;//相当于new了一个Integer对象
System.out.println(x == y);//false
}