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: