Java 编程思想(第四版)学习笔记(8)多态

本文详细介绍了Java中向上转型的概念与应用,探讨了如何通过向上转型来调用子类覆盖的方法,并深入分析了抽象类与抽象方法的定义及使用场景。此外,还讨论了向上转型与向下转型的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是向上转型?

对象既可以作为本身类型使用,也可以作为它的基类使用,而这种把某个对象的引用作为对基类对象的引用的做法叫做向上转型。---(因为在继承树的画法中,基类是放置在上方的)

class First{
    public void prt(){
        System.out.println("First");
    }
}
class Second extends First{
     public void prt(){
        System.out.println("Second");
    }
}
public class UpTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		First first = new Second();
		first.prt();  //输出Second
	    First[] x = {new First(), new Second()};
        x[0].prt();//输出First
        x[1].prt();//输出Second
		//Second second = new First();//报错Type mismatch: cannot convert from First to Second
	}
}

/*output

Second

First

Second

如果当Second class中的prt()函数注释掉,将输出First

2、 向上转型后只能调用base class中被derived class覆写的函数。

Abstract methods没有方法体

Abstract methods只能被定义在abstract class

abstract class First{
	int i=1;
    public void prt(){
        System.out.println("First.i="+i);
    }
    //Abstract methods do not specify a body
   // The abstract method prt in type First can only be defined by an abstract class
    public abstract void prt(First first);
}
class Second extends First{
     public void prt(){
       System.out.println("Second.i="+i);
    } 
@Override//The type Second must implement the inherited abstract method First.prt(First)
    public void prt(First first) {
	System.out.println("prt(First first)");
}  
   public void prt(int i) {
		
	}
}
public class UpTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		First first = new Second();
		first.prt();
		first.prt(first);
		//first.prt(2);//报错,提示The method prt(First) in the type First is not applicable for the arguments (int)
		//Second second = new First();//报错Type mismatch: cannot convert from First to Second
	}
}

/*output

Second.i=1

prt(First first)

3、 Abstract class 和Abstract methods (抽象类和抽象方法)

   1)如果一个class中存在abstract class,则class也必须被声明为abstract class。//The abstract method prt in type First can only be defined by an abstract class

   2)Abstract class不能被实例化。

   3)如果base class是一个abstract class,那么derived class必须实现base class中所有的abstract methods;否则,derived class也必须被声明为abstract class。//The type Second must implement the inherited abstract method First.prt(First)

   4)Abstract  methods没有方法体//Abstract methods do not specify a body

4、 纯粹继承与扩充

纯粹继承:只有base class所建议的函数,才被derived class加以覆写。

扩充:除了覆写base class的函数,还实现了自己的函数

abstract class First{

    public abstract void f();

    public abstract void g();

}

//纯粹继承

class Second extends First{

     public void f(){}

     public void g(){}

}

//扩充 

class Third extends First{

     public void f(){}

     public void g(){}

     public void u(){}//base class不存在的函数

}

5、 向下转型

1) 向下转型时只能调用base class中被覆写过的函数

2)只有本来就为derived class对象时才能正确向下转弄。

class First1{
    public  void f(){System.out.println("f()1");}
    public  void g(){System.out.println("g()1");}
}
class Second1 extends First1{
     public void f(){System.out.println("f()2");}
     public void g(){System.out.println("g()2");}
     public void u(){System.out.println("u()2");}
}
public class AbstractTest {
	public static void main(String[] args) {
        First1[] x = {new First1(), new Second1()};
        x[0].f();
        x[1].f();
        x[0].g();
        x[1].g();             
        ((Second1)x[1]).u();//向下转型
        ((Second1)x[0]).u();//报错java.lang.ClassCastException:
        //!x[1].u();class First中不存在函数u()
	}
}

/*output

f()1

f()2

g()1

g()2

u()2

Exception in thread "main" java.lang.ClassCastException:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值