JavaCore複習

/*!
 * 繼承
 * Java和C++繼承的區別在於
 * 1.Java繼承的關鍵字是extends,C++是:
 * 2.Java繼承只能是公有繼承,java沒有private,protected繼承
 * 3.Java繼承只能是單繼承,多繼承採用的方法類似接口實現
 */

import static java.lang.System.*;

/*!
 * 上課
 * interface的所有方法都是abstract public
 * 特別注意::abstract public ,說明實現接口的必須是public,
 * 如果是低於public會報降低了訪問權限
 */
interface AttendClass{
  String getClassName() ;
  String getTeacher();
  String getClassRoom();
}

/*!
 * class沒有說明訪問權限,默認是friendly
 * 只有同一個包內可見,一個java文件中只能擁有一個同名的public類(在頂層)
 * 當然嵌套是可以的
 * A.java
 * public class A{
 *  public class B{
 *  }
 * }
 *
 * public class M{} //錯誤,A中只能有一個public
 */
class Address{
  private String city;
  private String address;
  private String addressNo;
  private String province;

  public Address(String city, String address, String addressNo, String province){
    this.city = city;
    this.address = address;
    this.addressNo = addressNo;
    this.province = province;
  }

  public String toString(){
    return province +"省"+city +"市 "+address+addressNo;
  }

  public void show(){
    out.println(String.valueOf(this));
  }
}

/*!
 * 參加活動
 */
interface AttendActivities{
  String getActivitesName();
  String getHostName();
  Address getAssemblyPoint();
}

/*!
 * 基類,父類
 */
class Person{
  enum Sex{
    MALE,
    FEMALE
  }

  /*!所有的對象默認值都是null*/
  private String name = "";
  private int age = 18;
  private String id = "";
  private Sex sex;

  public Person(){
  }

  public Person(String name, int age, String id, Sex sex){
    this.name = name;
    this.age = age;
    this.id = id;
    this.sex = sex;
  }

  public String getSex(){
    return (sex == Sex.MALE) ? "Male" : "Female";
  }

  /*!
   * 測試子類對象調用同名的父類對象函數
   * 使用super關鍵字
   */
  public void showyou(){
    out.println("姓名:"+name +
        " 性別:" + getSex() +
        " 年齡:" + age +
        " 身份證號:" + id);
  }

  public void clone(Person other){
    this.name = other.name;
    this.age = other.age;
    this.id = other.id;
    this.sex = other.sex;
  }
}

/*!
 * 派生類,Java中派生類調用基類和python類似,調用super來實現
 * 在java中super關鍵子表徵父類對象
 * 在java中構造函數互相調用,必須使用this(argument,...)
 * 不能跟C++一樣直接使用類名稱來進行調用
 */
class Student extends Person implements AttendClass, AttendActivities{
  private String studentNo;

  public Student(String name, int age, String id, Sex sex, String studentNo){
    super(name, age, id, sex);
    this.studentNo = studentNo;
  }

  /*!構造函數互調*/
  public Student(int studentNo){
    this.studentNo = String.valueOf(studentNo);
    super.clone(generateNewPerson());
  }

  private static Person generateNewPerson(){
    return new Person("zhangsan", 29, "FSJ93209", Sex.MALE);
  }

  /*
   * 實現AttendClass和AttendActivities的接口
   * 接口的實現必須是public的,否則會報錯,正在分配更低的權限
   */
  public String getClassName() { return "一年級";}
  public String getTeacher() {return "老王";}
  public String getClassRoom() { return "302";}

  /*!
   * 實現AttendActivites的接口
   */
  public String getActivitesName() { return "爬山";}
  public String getHostName() { return "周星馳";}

  /*!Java 中所有的對象都要加上new,否則調用的時候會認爲是方法,找不到該方法*/
  public Address getAssemblyPoint() { return new Address("上海", "虹橋大街", "300號", "上海直轄市");}

  /*!
   * 重新實現Student自己的showyou
   */
  public void showyou(){
    super.showyou();
    out.println("我的學生號:" + studentNo);
  }

  public void yourActivities(){
    out.println("你要去:" + String.valueOf(getAssemblyPoint()) +
        " 招待人:" + getHostName() +
        " 活動主題:" + getActivitesName());
  }

  public void yourAttendClass(){
    out.println("你是: " + getClassName() + "學生"+
        " 你要去:" + getClassRoom() + "教室上課" +
        " 老師是:" + getTeacher());
  }
}

public class JavaCore05{
  public static void main(String[] args){
    Student s = new Student(1001);
    //在子類中調用父類的方法
    s.showyou();
    //調用實現的接口
    s.yourActivities();
    s.yourAttendClass();
  }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章