多态-instanceof-类型转换
package com.oop;
import com.oop.Demo6.Person;
import com.oop.Demo6.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
// // new Student();
// //new Person();
//可以指向的引用类型就不确定了
//可以通过父类的引用指向子类
//Student能调用的方法都是自己的或者继承父类的
Student s1 = new Student();
//Person父类型,可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
//子类有,而父类没有的方法,不能用s2调用
//强制类型转换,高转低
((Student) s2).eat();
}
}
===============================================================
package com.oop.Demo6;
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
==================================================================
package com.oop.Demo6;
public class Person {
public void run(){
System.out.println("run");
}
}
====================================================================
/*
多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系才能转换 //类型转换异常,不能强转 ClassCastException
3.多态存在的条件:要有继承关系。方法需要重写,父类的引用指向子类对象! father f1 = new son();
无法重写的方法:
1.Static方法静态方法,属于类,不属于实例
2.final 常量,被它修饰的,无法改变,在常量池
3.private方法,私有的,无法重写
*/
==============================================================
INSANCEOF
package com.oop;
import com.oop.Demo6.Person;
import com.oop.Demo6.Student;
import com.oop.Demo6.Teacher;
public class Application {
public static void main(String[] args) {
//Object>String
//Object>Person>Teacher
//Object>Person>Student
Object object = new Student();
// System.out.println(x instanceof y);是否通过编译,主要看他们是否有父子关系
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person );//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);
System.out.println("=====================================");
Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person );//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//false
// System.out.println(person instanceof String);//编译报错
System.out.println("=====================================");
Student student = new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person );//true
System.out.println(student instanceof Object);//true
// System.out.println(student instanceof Teacher);//编译报错
// System.out.println(student instanceof String);//编译报错
}
}
==========================================================================
package com.oop;
import com.oop.Demo6.Person;
import com.oop.Demo6.Student;
import com.oop.Demo6.Teacher;
public class Application {
public static void main(String[] args) {
//类型之间的转化: 基本类型转换 高转低需要强转 低转高不需要
/*
// 父类(高) 子类(低)
//高 低
Person obj = new Student();
//以上是低转高,不需要强制转换
//将obj这个对象转换为Student类型,就可以使用Student类型的方法
//即是高转低,需要强制转换类型
*//*Student student =(Student) obj;
student.go();*//*
((Student)obj).go();
*/
//子类转换为父类,可能丢失自己的本来的一些方法
Student student = new Student();
student.go();
Person person = student;
}
}
/*
1.父类引用指向子类的对象,左父右子,子类的引用不能指向父类的对象
2.把子类转换为父类,需要向上转型,不需要强制转换
3.把父类转换为子类,需要向下转型,需要强制转换,会丢失精度方法
4.方便方法的调用,减少重复的代码,使得代码简洁
(三大特性)
抽象: 封装>继承>多态 > 抽象类 > 接口
抽象就是编程思想
*/
--------------------------------------------
package com.oop.Demo6;
public class Person {
public void run(){
System.out.println("run");
}
}
----------------------------------------------
package com.oop.Demo6;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}