201521123063 《Java程序設計》第三週學習總結

1.本週學習總結

初學面向對象,會學習到不少碎片化的概念與知識。嘗試學會使用思惟導圖將這些碎片化的概念、知識組織起來。請使用紙筆或者下面的工具畫出本週學習到的知識點。截圖或者拍照上傳。html

2.書面做業

(1)代碼閱讀

public class Test1 {
    private int i = 1;//這行不能修改
    private static int j = 2;

    public static void main(String[] args) {
        geti();
        Test1.getj(); //此處懷疑少了個「.」,默認加上
    }

    public static void geti() {
        System.out.println(i);    //1
    }

    public static void getj() {
        System.out.println(j);   //2
    }

}

分析:1處會報錯,eclipse提示將「i」改成靜態的,即在靜態的方法中不能訪問非靜態的變量,2處不會報錯,由於靜態的方法中能夠訪問靜態屬性,其餘沒有錯java

若是建立3個Test1對象,內存中有3個i,1個j,i爲實例變量屬於對象的一個屬性,建立對象的時候就有了類的屬性和方法,靜態的變量不須要建立對象就能夠訪問,爲全部的對象所共享,直接用Test1.j就能夠訪問數組

(2)構造函數有什麼用?其編寫格式是什麼?若是一個類不寫構造函數,它有構造函數嗎?若是一個類中只有帶參的構造函數,它有沒有不帶參數的默認構造函數?

答:構造函數能夠用於對屬性的初始化
若是類名爲Person,則構造函數的格式以下,無返回值,可是能夠傳參安全

public Person(){
       System.out.println("Person類執行了");
        ......
    }

若是一個類不寫構造函數,那麼它默認是有的,而且會執行父類的方法eclipse

public Person(String name, boolean gender, int age, int id) {
    super();
    }

若是一個類中只有帶參的構造函數,不帶參數的默認構造函數就失效了,若是想要有不帶參數的構造函數,就須要顯示地打印出來ide

(3)使用java.lang.Math類的函數時,爲何不須要new?若是new Math()會產生什麼錯誤?分析緣由?

答:由於java.lang.Math類當中的方法和屬性都是靜態的,但Math類自己不是靜態的,不須要new一個對象,以下爲部分源代碼函數

public static final double E = 2.7182818284590452354;

public static int abs(int a) {
        return (a < 0) ? -a : a;
}

若是new Math(),按道理會執行無參的構造函數,可是出現提醒構造函數Math()是不可見的,打開源代碼就能夠發現,是private類型的,只容許本類訪問,因此會出錯工具

/**
 * Don't let anyone instantiate this class.
 */
 private Math() {}

(4)什麼是重載?什麼是構造函數重載?在java.lang.Math類中舉出1個函數重載的例子?怎麼才能區分兩個重載函數?

答:是指多個方法用同一個方法名,可是傳入的參數不一樣,例如求兩個是當中的最大值就有函數重載,能夠經過闖入參數的不一樣來區別兩個重載函數,經過返回值是不能區別開來的學習

public static int max(int a, int b) {
        return (a >= b) ? a : b;
 }

 public static double max(double a, double b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0d) &&
            (b == 0.0d) &&
            (Double.doubleToRawLongBits(a) == negativeZeroDoubleBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a >= b) ? a : b;
 }

(5)final修飾的變量不能改變,爲何以下代碼能夠正常運行?

final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;

答:final修飾引用類型變量,變量的引用不能被修改;如上代碼中是引用了數組對象,對象沒有被修改,可是對象指向的屬性值是能夠被修改的
因此是能夠正常運行的this

(6)閱讀代碼EmployeeTest.java,回答:

爲何其屬性均爲private?這樣設計有什麼好處?
爲Employee類增長一個無參構造函數,調用其有參構造函數,設置name爲僱員1, salary爲3000, hireDay的年月日爲2017年3月5日。(粘貼代碼)
爲Employee類再增長一個有參構造函數,參數只有name與salary,hideDay爲當前日期。(粘貼代碼)
答:這樣設計本類外就不能訪問這些屬性,多是爲了不職員的name等信息泄露,出於安全的考慮
增長一個無參構造函數

public Employee(){
    this("僱員1",3000,2017,3,5);
}

增長一個有參構造函數:

public Employee(String n, double s){
       this(n,s,Calendar.getInstance().get(Calendar.YEAR),Calendar.getInstance().get(Calendar.MONTH)+1,Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
   }

參考連接:http://blog.csdn.net/kookob/article/details/6885383

(7)編寫函數public static boolean isMondayToFriday()

功能:判斷今天若是是週一到週五,直接輸出如「上班時間」並返回true,不然輸出「休息時間」。
提示:使用LocalDateTime, DayOfWeek
參考資料:
JAVA 8:健壯、易用的時間-日期API - ImportNew.pdf
Java8DateTimeTest.java

public class GetTime {
    public static boolean isMondayToFriday(){
        LocalDate today = LocalDate.now();  
        DayOfWeek week=today.getDayOfWeek();
        if(week.getValue()>=1&&week.getValue()<=5){
            return true;
        }
        else
            return false;
    }
    public static void main(String[] args) {
        if(GetTime.isMondayToFriday())
            System.out.println("上班時間");
        else
            System.out.println("休息時間");
    }

}

運行截圖:

(8)Runnable Jar(可選)(完了...這題題目看錯了。。。)

咱們之前編寫的程序,必須打開Eclipse或者將相應的.class文件拷貝出來在命令行下執行相應命令才能運行,若是.class文件較多且類文件中有包名,須要將完整的目錄結構及文件拷貝出來,才能運行。如今但願將Eclipse項目中的Java文件打打成一個可運行的jar包,在命令行直接運行。改造題目7,使其從命令行接收參數,參數爲年-月-日,將項目打成jar包,而後在命令行經過java -jar運行,並截圖。
打包成jar包截圖以下:(文件名:test8.jar,包名:Test8,類名EmployeeTest)

運行結果:

參考文章:http://jingyan.baidu.com/article/4dc40848b5a8c9c8d946f139.html

3. 碼雲代碼提交記錄截圖:

4.PTA實驗

  • 第一題題目要求要逆序輸出對象的內容,則須要建立數組來存放,調用有參的構造函數,進行初始化
    無參的構造函數在建立對象的時候就能執行了,將屬性用private修飾比較安全,以後能夠用eclipse能夠自動生成setter(設置器),getter(訪問器)方法,使其具備封裝性

  • 第二題當中的靜態塊通常只執行一次,因爲每一個對象的id屬性都不一樣,將其定義爲靜態的屬性,經過累加計算地址,給id賦值,具體類加載的過程見第一題

  • 第三題就是編寫Circle類和Rectangle類,當中都有計算面積和周長的方法,比較中規中矩,但會產生代碼冗餘,在接下來的學習中能夠用繼承和多態的方法來實現

相關文章
相關標籤/搜索