案例一:
Student.java 子类
package com.oop.demo06;
public class Student extends Person {
public void run (){
System.out.println("son");
}
public void eat(){
System.out.println("ear");
}
}
/*
多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类要有联系 不能是String Person 两者没有任何关系
类型转换异常! ClassCastException!
3.存在的条件: 继承关系,方法需要重写,父类引用指向子类对象!
father f1 = new son()即: Person s2 = new Student();
1.static 方法,属于类,它属于实例
2.final 常量
3.private 方法;
instanceof (类型转换)引用类型 可以判断一个对象是什么类型
*/
Person.java 父类
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
Application.java 应用类
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了;父类的引用类型指向子类
//Studnet 能调用的方法都是自己的或者是继承父类的!
Student s1 = new Student();
//person 父类型,可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
s2.run();//子类重写了父类的方法,执行子类的方法
s1.eat();
s1.run();
((Student) s2).eat();//父类中没有的方法,子类中有,父类要使用只能把他强制转化为子类的。
}
}
运行结果:
son
ear
son
ear
案例二
student.java teacher.java Person.java
package com.oop.demo07;
public class Student extends Person {
}
package com.oop.demo07;
public class Teacher extends Person {
}
package com.oop.demo07;
public class Person {
public void run(){
System.out.println("run");
}
}
Application.java
package com.oop.demo07;
public class Application {
public static void main(String[] args) {
//Object>String
//Object>Person>Student
//Object>Person>Teacher
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);//false
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);//编译报错,person和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);//编译报错 student和teacher同一等级,两者没有关系
//System.out.println(student instanceof String); //编译报错 student和string 没有关系。
}
}
运行结果:
true
true
true
false
false
==================
true
true
true
false
==================
true
true
true
案例三
student.java person.java
package com.oop.demo07;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
package com.oop.demo07;
public class Person {
public void run(){
System.out.println("run");
}
}
Application.java
package com.oop.demo07;
public class Application {
public static void main(String[] args) {
//基本类型之间的转换;父 子
Person obj = new Student();
//student将这个对象转换为student类型,我们就可以使用student类型的方法了。
//子类转换为父类,可能丢失自己本来的一些方法!
Student student = (Student) obj;
student.go(); //这两句等同于((Student).obj).go();
//低转高可以自动转,高转低要强制转。
Person person = student;
}
}
/*
1.父类引用子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型。强制转换
4.方便方法的调用,减少重复的代码!简洁
抽象: 封装、继承、多态!接口
*/