前言
class Outer{
public void show(){}
}
class Inner extends Outer{
public void show(){}
}
Outer out = new Inner();大家都懂 这肯定是合法的,因为 Inner 类 是 Outer的子类嘛。所以Outer 的引用变量可以指向 子类Inner对象的地址嘛。为什么要这样做呢?有什么意义?
引入
接下来再看一段代码
class Outer1{
void method(){}
}
class Demo{
public static void main(String[] args){
new Outer1(){
public void method1(){}
}.method();//编译通过;子类对象自定义了一个自己的方法并运行。
Inter Outer1= new Outer1(){
public void method1(){}
}
inter.method();//编译失败,因为父类引用指向子类对象,只能调用子类中通过覆写的方法}
}
向下转型
如果我们想要子继承父类,又要拓展自己的东西,还要使用父类引用那我们(后面我们会说为什么要使用父类引用)该怎么办?
上一段代码我们使用的是匿名内部类(为什么叫内部呢,是因为类的描述在类里)
如果是使用匿名内部类 将无法为对象向下转型。
class Outer{
}
class Inner extends Outer{
public void method1(){}
}
class Demo{
public void static main(String[] args){
Outer outer = new Inner();//其实这段和上面那段匿名内部类作用相同
Inner inner = (Inner)outer;//强转
inner.method();//这样讲编译通过。
}
}
封装性的问题
abstract class ball {
int r ;
int color’
public abstract void show();
}
class Outer{
private class Basketball extends ball{
public void show (){
System.out.println(“Basketball “);
}
}
//因为封装性,所以都 private
public Basketball newBasketball (){
return new Basketball ();
}
}
class DemoMain{
public static void main(String [] args){
Outer outer = new Outer();
//Basketball basket = outer.newBasketball();
//因为封装性。所以导致我们无法进行调用Basketball
ball basket = outer.newBasketball();
}
}