java学习笔记之—多态



一、父类引用指向子类对象:

父类引用指向子类对象时,注意以下几点:
1、实例化一个没有名字的子类对象,然后向上转型为父类的父类的引用,先去调用子类重写的方法,子类没有重写就再去调用父类的方法。
2、只能调用父类中定义过的方法和变量(父类中没有定义过调用的时候要报错)
3、专属于子类的成员变量,在子类方法中被访问时,这时候通过父类引用还是可以调用子类重写的的方法
4、覆盖private方法虽然编译器不会报错但是也不会按照我们所期望的执行
5、覆盖变量后,调用的成员变量与我们所期望的不一样
6、静态方法的行为不具有多态性,因为静态方法是与类,而非是对单个对象相关联的。

class Son extends Super{
	int fo=2;//不是应该引用我吗?
	String s="子类专属的变量用在子类重写的方法中,利用父类引用可以调用该方法";
public void f(int i){
		System.out.println(s);
	}
void f(){
	System.out.println("不是应该调用子类方法的吗?");
}
static void g(){
	 System.out.println("子类静态方法");
}
}
public class Super {
	int fo=1;//覆盖变量后,调用的成员变量与我们所期望的不一样,调用的是父类的成员变量
     private void f(){
		System.out.println("父类方法访问权限为private时,调用父类方法");
	}
     void f(int i){
    	 System.out.println("子类的f(i)方法");
     }
     static void g(){
    	 System.out.println("父类静态方法");
     }
	public static void main(String[] args) {
		Super s1=new Son();
		s1.f(1);
		s1.f();//private方法对导出类是屏蔽的,所以覆盖private方法虽然编译器不会报错
		//但是也不会按照我们所期望的执行
		System.out.println("覆盖变量结果,fo="+s1.fo);
		s1.g();//调用的是父类的静态方法
	}
}

运行结果:
子类专属的变量用在子类重写的方法中,利用父类引用可以调用该方法
父类方法访问权限为private时,调用父类方法
覆盖变量结果,fo=1
父类静态方法

二、多态:

多态存在的条件:
一、要有继承;
二、要有重写;注意不是重载
三、父类引用指向子类对象。实例化一个没有名字的子类对象,然后向上转型为父类的父类的引用
只能调用父类中定义过的方法和变量(父类中没有定义过调用的时候要报错)

class A {
	public String show(D obj){
		return("A and D");
	}
	public String show(A obj){
		return("A and A");
	}
}
class B extends A{
	public String show(B obj){
		return("B and B");
	}
	public String show(A obj){
		return("B and A");
	}
}
class C extends B{	
}
class D extends B{
}
public class T1 {
	public static void main(String[] args) {
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();
        /*方法调用的优先级
         1、this.show(O)
         2、super.show(O)
         3、this.show((super)O)、
         4、super.show((super)O) */       
        System.out.println(a2.show(b));
        /*
         1、this.show(b)=a2.show(b)在A类里找show(b)方法,A类里没有show(b)方法
         2、super.show(b)=?A类没有super类
         3、this.show((super)b)=a2.show(a),在A类中有show(a)方法
         4、a2引用指向的是B对象,且B类中有对A类中的show(a)方法重载,所以最终调用的是B类中的
         show(a)方法
                      第4步中
                      父类引用指向子类对象,先去调用子类重写的方法,子类没有重写就再去调用父类的方法。                                     
         */
        System.out.println(a2.show(c));
        /*
         1、this.show(c)=a2.show(c)在A类里找show(c)方法,A类里没有show(c)方法
         2、super.show(c)=?A类没有super类
         3、this.show((super)c)=a2.show(b),在A类中有show(a)方法
                       接下来同上一输出
         4、this.show(b)=a2.show(b)在A类里找show(b)方法,A类里没有show(b)方法
         5、super.show(b)=?A类没有super类
         6、this.show((super)b)=a2.show(a),在A类中有show(a)方法
         7、a2引用指向的是B对象,且B类中有对A类中的show(a)方法重载,所以最终调用的是B类中的
         show(a)方法
         */
        System.out.println(a2.show(d));
        /*
         this.show(d)=a2.show(d)在A类里找show(d)方法,A类中有show(d)方法
                       因为B类中没有重载A类的show(d)方法,所以最终执行的是A类中的show(d)方法
         */
        System.out.println(b.show(b));
        System.out.println(b.show(c));      
        System.out.println(b.show(d));
        /*
         1、this.show(d)=b.show(d),在B类中找show(d)方法,找不到。
         2、super.show(d)=a.show(d),在A类中找show(d)方法,找到后调用A类的show(d)
         */
	}
}

运行结果:
B and A
B and A
A and D
B and B
B and B
A and D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值