【狂神说Java】多态及类型转换
多态
- 同一方法可以根据发送对象的不用而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的类型有很多
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类应用指向子类对象
注意:多态是方法的多态,属性没有多态。
- 对象能执行哪些方法和对象左边的类型有关,和右边关系不大。
- 父类可以指向子类但是不能调用子类独有的方法,即父类没有这个方法,实例化后的对象也不能使用这个方法。
- 强制转换的类型必须有继承关系
public class Main {
public static void main(String[] args) {
// 多态,只有在程序运行中才能动态的确定
// 一个对象的实际类型是确定的 new Student
// 可以指向的的引用类型就不确定了,Student、Person...
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
s1.run(); // 子类跑步
s2.run(); // 子类跑步;子类重写调用的是子类的方法,如果要用父类的方法:Person s2 = new Person();
// 只有引用类型中有的方法才能被调用
// s3.run(); object中没有run(),会出错
s1.sleep(); // 父类睡觉;没有重写父类方法,调用直接继承父类方法
s2.sleep(); // 父类睡觉
// s3.sleep(); //object中没有sleep(),会出错
((Student) s2).test(); // 引用类型强制转换成Student就能使用Student的方法了。
}
}
class Student extends Person {
@Override
public void run() {
System.out.println("子类跑步");
}
public void test(){
System.out.println("子类测试");
}
}
class Person {
public void run(){
System.out.println("父类跑步");
}
public void sleep(){
System.out.println("父类睡觉");
}
}
注意:
- static方法,属于类,它不属于实例,没有多态
- final 修饰的写入常量池,没有多态
- private修饰的也无法被重写,没有多态
instanceof
instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。
instanceof是测试一个对象是否为一个类的实例,返回true或者falseinstanceof判断的对象必须有继承关系,否则编译出错- 实例化对象时,这个对象是它本身的类及其父类的实例。
- instanceof可以理解为某一个类是另一个类的具体的个例么,例如:【括号内的为引用类型】
- (事物)学生 instanceof 人 ,学生是人的一个个例(事物和人有关,编译不报错)
- (事物)学生 instanceof 事物 ,学生是事物的一个个例(事物和事物有关,编译不报错)
- (事物)人 instanceof 人 ,人也是人的一个个例(事物和人有关,编译不报错)
- (事物)人 instanceof 字符串 ,人不是字符串的一个个例(事物和字符串有关,编译不报错)
- (人)人 instanceof 字符串 ,(人和字符串没有关联,编译报错)
- (事物)人 instanceof 学生,人不一定是学生(事物和学生有关,编译不报错)
// 结构 Object->String
// 结构 Object->Person->Student
// 结构 Object->Person->Teacher
Object s3 = new Student();
System.out.println(s3 instanceof String); // false
System.out.println(s3 instanceof Student);// true
System.out.println(s3 instanceof Person);// true
System.out.println(s3 instanceof Teacher);// false
System.out.println(s3 instanceof Object);// true
// new的对象和引用类型必须有继承关系,否则编译出错
Student s1 = new Student();
//System.out.println(s2 instanceof String); 编译出错 Student和String没有关系
System.out.println(s1 instanceof Student);// true
System.out.println(s1 instanceof Person);// true
//System.out.println(s1 instanceof Teacher);/编译出错 Student和Teacher没有关系
System.out.println(s1 instanceof Object);// true
Person s4 = new Person();
//System.out.println(s4 instanceof String); //编译出错 Person和String没有关系
System.out.println(s4 instanceof Student);// false
System.out.println(s4 instanceof Person);// true
System.out.println(s4 instanceof Teacher);// false
System.out.println(s4 instanceof Object);// true
类型转换
- 引用类型在转换的时候,子类转父类可以自动转但是会损失子类方法
- 父类想调用子类方法需要强制转换,例如:
((Student)Person).子类方法

浙公网安备 33010602011771号