Java基础知识——super关键字

</pre>1、继承要注意的几点:属性和方法的不同。<p><span style="color:#ff0000">  属性不可重写,属性可以覆盖</span></p><p><span style="color:#ff0000">  属性没有多态性,<strong>属性值取决于引用类型</strong></span></p><p><span style="color:#ff0000">  方法可以重写,方法有多态性</span></p><p><span style="color:#ff0000">  <strong>方法的行为取决于对象</strong>而不取决于引用类</span></p><p><span style="color:#ff0000">  生成子类对象必须调用父类构造方法,子类构造方法必须和父类构造方法匹配。</span></p><p>注意上一章:final关键字对属性和对象的修饰效果。</p><p>下面程序代码中a.name与a.fn();分别为属性和对象。继承时有所不同。<span style="color:rgb(255,0,0)">属性值取决于引用类型,<span style="color:rgb(255,0,0)">方法的行为取决于对象。</span></span></p><p></p><pre name="code" class="java">  class A
  {
	  String name="伟哥";

	  public void fn()
	  {
        System.out.println("A class fn() executing...");
	  }
  }
  class B extends A
  {   
	  String name="君少";//这样会覆盖A类的name,输出君少。
	
     @Override
	   public void fn()
	  {
        System.out.println("B class fn() executing...");
	  }
	  public static void main(String[] args)
	  {
         B b=new B();
		 System.out.println(b.name);//输出君少。

		 A a=new B();//A指向子类对象,并没与打印B类的name属性
		 //而是打印A类的name,属性没有多态性。
         System.out.println(a.name);//属性值取决于引用类型 这里的
		 //a是对A的引用,所以输出a.name的值。
		 a.fn();//如果调用的是方法,会体现多态性,打印出B类的fn()

	  }
  }

2、感受下面的代码。

  -----------------------------
  class A
  {
	  String name="伟哥";
	  A()
	  {
		   System.out.println("A constructor A() is executing...");
	  }
	    A(String name)
	  {
			 System.out.println("A constructor A(String name)is executing...");
			this.name=name;
	  }
	  public void fn()
	  {
        System.out.println("A class fn() executing...");
	  }
  }
  class B extends A
  {   
	  String name="君少";
	    B()
	  {
			System.out.println("B constructor B() is executing...");
	  }
	    B(String name)
	  {     
            
			//super(name);
			System.out.println("B constructor B(String name) is executing...");
			this.name=name;
	  }
     @Override
	   public void fn()
	  {
        System.out.println("B class fn() executing...");
	  }
	  public static void main(String[] args)
	  {
       A a=new B("王老吉");
	   System.out.println(a.name);
	   a.fn();
	  }
  }

 输出结果:A constructor A() is executing...//默认执行不带参数的
           B constructor B(String name) is executing...
		   伟哥
		   B class fn() executing...
注:如果调用A(String name)的话,需要使用super;

super关键字
引用父类对象的属性和方法,调用父类构造方法,必须是构造方法里的第一句。

class A
  {
	  String name="伟哥";
	  A()
	  {
		   System.out.println("A constructor A() is executing...");
	  }
	    A(String name)
	  {
			 System.out.println("A constructor A(String name)is executing...");
			this.name=name;
	  }
	  public void fn()
	  {
        System.out.println("A class fn() executing...");
	  }
  }
  class B extends A
  {   
	  String name="君少";
	    B()
	  {
			System.out.println("B constructor B() is executing...");
	  }
	    B(String name)
	  {     
           super(name);//调用父类构造方法;
            System.out.println("B constructor B(String name) is executing...");
			System.out.println("super(name)..."+super.name);//获得父类的属性
			this.name=name;
	  }
     @Override
	   public void fn()
	  {
        System.out.println("B class fn() executing...");
	  }
	  public static void main(String[] args)
	  {
       B a=new B("王老吉");
	   System.out.println(a.name);
	   a.fn();
	  }
  }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值