多态性在面向对象是一个重要的概念,在Java中面向对象主要有以下两种主要体现:
1方法的重载与覆写
2对象的多态性
1 向上转型 : 子类对象--父类对象
对于向上转型,程序会自动完成,而对于向下转型是,必须明确地指明要转型的子类类型,格式:
对象向上转型: 父类 父类对象=子类实例 *(调用的方法一定是被子类覆写过的方法)
结果:B---public void f1(){}
B---public void f1(){}
B---public void f3(){}
1方法的重载与覆写
2对象的多态性
对象的多态性主要分两个类型
1 向上转型 : 子类对象--父类对象
2向下转向:父类对象--子类对象--父类对象
对于向上转型,程序会自动完成,而对于向下转型是,必须明确地指明要转型的子类类型,格式:
对象向上转型: 父类 父类对象=子类实例 *(调用的方法一定是被子类覆写过的方法)
向下转型: 子类 子类对象 ={子类}父类实例
//向上转型
class A{ //定义类A
public void fl(){ //定义f1()的方法
System.out.println("A----public void fl({}");
}
public void f2(){ //定义f2()方法
this.fl();
}
}
class B extends A{ //子类通过extends继承父类
public void fl(){ //覆写父类中的方法
System.out.println("B---public void f3(){}");
}
public void f3(){
System.out.println("B---public void f3(){}");
}
}
public class PolDemo01{
public static void main(String[] args){
B b = new B();//定义子类实例化对象
A a = b;//发生了向上转型的关系,子类--父类
a.fl();//此方法被子类覆写过
}
}
//向上转型
class A{ //定义类A
public void fl(){ //定义f1()的方法
System.out.println("A----public void fl({}");
}
public void f2(){ //定义f2()方法
this.fl();
}
}
class B extends A{ //子类通过extends继承父类
public void fl(){ //覆写父类中的方法
System.out.println("B---public void f3(){}");
}
public void f3(){
System.out.println("B---public void f3(){}");
}
}
public class PolDemo01{
public static void main(String[] args){
B b = new B();//定义子类实例化对象
A a = b;//发生了向上转型的关系,子类--父类
a.fl();//此方法被子类覆写过
}
}
B---public void f1(){} 从程序的运行结果中可以发现,此时虽然是使用了父类对象调用了f1方法,但是实际上调用的方法是被子类复写过的方法,也就是说如果对象发生了向上转型关系后所调用的方法一定是被子类腹泻过的方法
B---public void f1(){} 从程序的运行结果中可以发现,此时虽然是使用了父类对象调用了f1方法,但是实际上调用的方法是被子类复写过的方法,也就是说如果对象发生了向上转型关系后所调用的方法一定是被子类腹泻过的方法
public class PolDemo02{
public static void main(String[] args){
A a = new B();//定义子类实例化对象
B b = (B)a;//发生了向下转型的关系,
b.fl();//此方法被子类覆写过
b.f2();//调用父类的方法
b.f3();//调用子类自己的方法
}
}
结果:B---public void f1(){}
B---public void f1(){}
B---public void f3(){}
/如果要向调用子类自己的方法,则一定只能用子类声明对象,另外,在子类中调用父类中的f2()方法,f2()方法要调用f1()方法,但是此时f1()方法已经被子类多覆写,所以此时调用的方法是被子类覆写过的 方法
/* 要注意的是在发生对象向下转型前,必须首先发生对象向上转型,否则会出现对象转换异常 */
public class InstanceofDemo02{
public static void main(String[] args){
f(new B());//传递B类实例,产生向上转型
f(new C());//传递C类实例,产生向上转型
}
public static void f(A a){//此方法可以分别调用各自自乐日单独定义的方法
a.f1();
if(a instanceof B){//判断是否是B类实例
B b = (B)a;//进行向下转型
b.f3();//调用子类自己定义的方法
}
if(a instanceof C){ //判断是否是C实例
C c = (C)a;//进行向下转型
c.f5();//调用子类自己的方法
}
}
}
/* 程序可以看到,因为要调用各自子类的方法,所以必须进项对象的向下转型,但是为了保证程序运营时不出啊先类转换异常,所以子啊发生向下转型前用instanceof关键字判断是哪个子类的实例,以保证程序的运行正确 */
//抽象类的实际应用--模板设计
abstract class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void say(){
System.out.println(this.getContent());
}
public abstract String getContent();
}
class Student extends Person{
private float score;
public Student(String name,int age,float score){
super(name,age);
this.score = score;
}
public String getContent(){
return "学生信息--姓名:" + super.getName() + ";年龄:" +super.getAge() + ";成绩:" + this.score;
}
}
class Worker extends Person{
private float salary;
public Worker(String name,int age,float salary){
super(name,age);
this.salary = salary;
}
public String getContent(){
return "工人信息--姓名:" + super.getName() + ";年龄:" + super.getAge() + ";工资:" + this.salary;
}
}
public class AbstractCaseDemo01{
public static void main(String[] args){
Person per1 = null;
Person per2 = null;
per1 = new Student("李正",30,99.5f);
per2 = new Worker("李正",30,3000.5f);
per1.say();
per2.say();
}
}