java 多态----静态时static和类型转换

public class Text2
{
public static void main(String[] args)
{
A b= new B();
B a =(B) b; //向下类型转化(需强制转换),向上类型转化不用强制转换
b.getout();
a.getout();
}
}
class A
{
public A()
{
System.out.println("A");
}
public static void getout() //在父类声明一个静态方法 ,,静态方法不能被重写(此类型发生在继承中),也不能被覆盖(发生在同类中)
{
System.out.println("A getout");
}
}
class B extends A
{
public B()
{
System.out.println("B");
}
public static void getout() //在子类声明一个静态方法
{
System.out.println("B getout");
}
}

总结:在静态方法中,子类声明了一个静态方法,父类声明了一个静态方法,如果发生了重写,则是声明什么类型的引用的,就调用什么类型的静态方法,如果子类声明静态方法,父类声明的不是静态方法,则会编译错误,反之亦然。

通俗理解向上转型:就是子类转型成父类。
1. class A
2. {
3. }
4. class B extends A
5. {
6. }
7. A a = new B();
这个就是向上转型。
向上转型可以像下面这条语句这么简单:
Shape s = new Circle();
这里,创建一个Circle对象,并把得到的引用立即赋值给s,这样做看似错误(将一种类型赋值给另一种类型),但实际上没有问题,因为通过继承,Circle就是一种Shape(子类是父类,就如男人是人一样)。编译器认可这条语句,也就不会产生错误信息。
假设你调用了一个父类方法(它已经在子类中被覆盖)
s.draw();
你可能认为调用的是Shape 的draw()方法,因为这毕竟是一个Shape引用,但此时s真正指向的是Circle对象,由于后期绑定(多态),编译器还是正确调用了Circle的draw()方法。
总结:
1.通过父类型引用指向子类型对象来实现动态调用
B b = new B();
A a = b; //A为基类,B是继承A的子类
a.play(); //play()在A,B中均有定义,即子类重写(覆写)了该方法
分析:
# 为什么父类型的引用可以指向子类型的对象?
自动实现向上转型。通过A a = b;语句,编译器自动将子类对象向上移动,成为A类型
# a.play()将执行子类还是父类中定义的方法?
子类的。在运行时期,将根据a这个引用所指向的实际对象来获取相应的方法,这也是多态性。一个父类的引用,指向不同的子类对象,执行该方法时,将表现出不同的行为。
2.不能将子类引用指向父类对象
A a = new A();
B b = a; //这样是不行的,对比前面,可以知道父类不是子类(如同人不是男人)
在java中,向上转型是自动进行的,但是向下转型却不是,需要我们强制进行类型转换。如:
B b = new B();
A a = b;
B bb = (B)a; //进行强制类型转换,也就是向下转型
3.记住一个简单而又复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量,你可能说这个规则不对,因为父类引用指向子类对象时,最后执行的是子类的方法。其实这并不矛盾,那是因为采用了后期绑定(多态),运行时编译器又根据引用指向的实际类型去调用了子类的方法,而假若子类的这个方法在父类中并没有定义,则编译会出错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值