java學習第四天

類的繼承java

       類的繼承要使用關鍵字  extendside

       實現類的複用,提升效率有兩種方法函數

       一、將一個類看成另外一個類的屬性(合成/聚合關係)
      
       二、一個類繼承另外一個類,實現繼承的類稱爲 子類 或者 叫 派生類
this

而被繼承的類稱爲 父類 ,也叫作 超類 或 基類
 
spa

經過 繼承 一個現有的類,可使用已經定義的類中的方法 和屬性對象

類的方法 和屬性能夠被繼承,但 類的 構造器(方法,函數)不能被繼承繼承


關鍵字super(其實就是父類的一個可變的對象)ip

           能夠訪問父類中定義的屬性,成員方法  還能夠用在子類構造器(方法,函數)get

中調用父類的構造器it

 

 

/**
 * 構造函數
 *  一、子類new 對象的時候,必須調用父類構造函數
 *  二、若是父類沒法提供子類所須要的構造函數,這時會報錯
 *   報錯現象:
 *    父類自定義帶參數的構造函數,而子類使用默認的構造函數(無參數的)
 *   最佳的解法:自定義類時,自定義一個空參數的構造函數(養成習慣)
 *  三、能夠經過,super進行調用父類的構造函數,進行初始化父類屬性
 *  四、構造函數不能被子類繼承
 */

public class Son extends Father {
 
 private String sonField;
 
 public Son(){
  super();  //默認調用這個super空參數的
  
  //第一種賦值方式
  //有弊端,屬性值固定
  super.setAge(1);
  super.setFatField("1111");
 }
 
 public Son(String field, int age){
  /*//super();  //默認調用空參的父類構造函數
  super(field, age);  //調用父類的帶參數的構造函數*/
  
  //Constructor call must be the first statement in a constructor
  //super 跟this 在構造方法中,只能存在一個
  //緣由:super  this 都必須是第一行執行
  //強調一點:此處的this 是調用構造函數
  /*this(field);
  super(age);*/
 }
 
 public Son(String field){
  //super();  //默認調用空參的父類構造函數
  //System.out.println();
  super(field);  //調用父類的帶參數的構造函數
  this.sonField = field;
 }
 
 
 

 public static void main(String[] args) {
  /*Son son = new Son();
  System.out.println(son.getAge());
  System.out.println(son.getFatField());*/
  
  System.out.println("----------------------------");
  Son son2 = new Son("2222", 2);
  System.out.println(son2.getAge());
  System.out.println(son2.getFatField());
  
 }
}


---------------------------------------------------------------------------

 

/*
 * 繼承屬性的知識點:
 * 一、若是父類有某個屬性,而子類恰好也一個如出一轍的屬性,子類訪問時,訪問的是子類的屬性
 * 若是子類沒有這個屬性,那麼訪問父類的屬性, 這個特性叫:屬性隱藏
 * 二、若是子類非得去獲取父類的屬性,能夠經過super去獲取,注意super 自能在列的內部使用
 * 三、子類繼承父類的屬性和方法,可是,沒法繼承父類private 修飾的方法或屬性
 * 四、子類也繼承了父類的靜態屬性
 */
public class Son extends Father{
 private int age = 18;
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Son() {
  System.out.println("son 的構造方法....");
 }
 
 public static void main(String[] args) {
  //知識點:子類初始化(建立對象)時,首先調用父類的構造器,生成父類對象,
  //而後在進行子類初始化。
  Son son = new Son(); 
  //father中有age ,子類也age 打印 son的age
  System.out.println(son.getAge());  //18
  //father中有age ,子類沒有age 打印 father的age
  System.out.println(son.getAge());  //40
  System.out.println(son.fatname);
  
  System.out.println(Son.staticField);
  System.out.println(son.staticField);
  System.out.println(Father.staticField);
 }
}


-----------------------------------------------------------------------


/*
 * 類繼承的方法知識點
 * 1、方法的重寫
 *  若是父類中有一個方法,而子類中有個一個如出一轍的方法,這個時候,我稱爲方法的重寫
 *  重寫的條件注意點:
 *  一、方法名如出一轍
 *  二、參數列表如出一轍
 *  三、返回值如出一轍
 *  四、訪問控制權限:
 *   1>  若是父類中有個方法,是private 修飾的,而子類恰好也有一個如出一轍的方法,
 *    這個時候,不能稱爲方法的重寫,子類的方法,是自定義的方法
 *   2>  若是父類中有個方法,而子類恰好也有一個如出一轍的方法,子類的方法,訪問權限
 *    必須大於或等於父類的方法的訪問權限
 *  五、拋出的異常
 *   子類方法重寫,拋出的異常,是父類拋的異常的子類或相同類
 *
 * 2、靜態方法
 *  一、子類也能夠繼承父類的靜態方法
 *  二、子類不能重寫父類的靜態方法
 *
 */
public class Son extends Father {
 
 //方法名不同,不算重寫
 public void info1(){
  System.out.println("Son.info1()");
 }
 
 //參數列表不同,不算重寫,不算重載,由於不在同一個類
 public void info(int a){
  System.out.println("Son.info(a)");
 }
 
 
 
 /*Multiple markers at this line
 - Cannot reduce the visibility of the inherited method from
  Father
 - overrides com.qianfeng.demo6.Father.info*/
 protected double info(){
  System.out.println("Son.info()");
  return 1;
 }
 
 
/*@Override  // overload
 public static void staticMethod(){
  System.out.println("son.staticMethod()");
 }*/
 
 
/*@Override  //java 註解 private void privateMethod(){  System.out.println("son.privateMethod()"); }*/  public static void main(String[] args) {  Son son = new Son();  son.info();    Son.staticMethod(); }}

相關文章
相關標籤/搜索