Java逍遙游記讀書筆記<一>


前言

必須先來一句,這是入門級別,高手勿噴~

寫Android的時候總有一些語句不是很理解,其實大部分是Java的內容,所以想系統的學下Java。

這本書——《Java逍遙游記》是在圖書館偶然看到的,被橫放在書架上,看來是被人翻過直接丟那里了,索性拿來看一看。

很基礎的一本書,廢話很多,比如孫悟空想學編程什么什么的,但可以理解作者的一片苦心。既然如此水,那就把它借回來想快速掃一下以增加成就感,用一種查漏補缺的態度,看到哪里不會就記下來,最終目標就是這本書就作廢了,對我有價值的東西都在筆記上,所以就有了這幾篇筆記。

Anyway,一千個人眼中有一千哈姆雷特,我記下的東西不一定適合所有人,這里面既有Java的內容,也有些是我在學C++的時候的一些遺漏(語言都是相通的~),所以抱着交流學習的態度的同時更多的是對自己知識的歸納整理。若這些東西對你有用,那便是極好的。

HelloWorld

一、前提:已安裝好Jdk(Java Development Kit)

二、配置環境變量:

新建環境變量JAVA_HOME:F:\JDK      (這是我的路徑)

編輯path變量:添加%JAVA_HOME%\bin;

編輯CLASSPATH變量:C:\Users\Administrator\Desktop;

有必要解釋下ClassPath變量,你通過javac編譯出來的.class文件必須放置在ClassPath中任意路徑中,才能運行成功,比如我把Hello.class放在桌面,那么為了運行成功,我就在ClassPath中添加桌面的路徑C:\Users\Administrator\Desktop;否則會出現

錯誤:找不到或無法加載主類

運行cmd

定位到Hello.java所在位置

鍵入javac Hello.java

鍵入 java Hello (注意沒有.class)

public class Hello
{ 
    public static void main(String[] args)
    { 
        System.out.println("Hello, world!"); 
    } 
}
Hello.java

 

程序入口main函數

必須是publicstaticvoidString數組參數,缺一不可。

public static void main(String[] args){}

 

Java的編譯與運行

 

Java源文件結構

每個Java源文件可以有多個類的定義,但最多只能有一個類是public的,而且該源文件必須以public類的名字命名。

(注:Java中類的定義后面分號不是必須的)

 

public class Test{}

class Sample1{}

class Sample2{}
Test.java

 

包的引入

假如com.java.school里有一些類,同時還有一個文件夾classes,那么

import com.java.school.*;

只會引入school根目錄下的所有類(*表示所有),而不會引入classes目錄下的類。若還想繼續引用classes下的類,則應當這樣寫。

import com.java.school.*;
import com.java.school.classes.*;

 

編程規范

  • 類:所有單詞首字母大寫。如MonkeySmartMonkey
  • 方法和變量:首字母小寫,其余單詞首字母大寫。如addlistAll
  • 包:全部小寫。如com.java.school.classes
  • 常量:全部大寫,若多個單詞則加下划線隔開。如final String COLOR_OF_MONKET = “red”;

 

實例變量和靜態變量(類變量)

  • 無論你創建了多少實例,類的靜態變量在內存中只有一個,被類的所有實例共享。
  • 靜態變量可以通過實例名訪問,也可以通過類名被訪問。
  • 每創建一個實例,系統就會為實例變量分配一次內存。
  • 實例變量只能通過實例名訪問。

具體看下例子就可以懂了。

public class Person
{
    public int id = 0;        //Java支持在聲明時初始化 
    
    public static int sum = 0;    //Java支持在聲明時初始化 
    
    public Person()
    {
        id++;
        
        sum++;
    }
    
    public static void main(String[] args)
    {
        Person p1 = new Person();

        Person p2 = new Person();
        
        System.out.println(p1.id);        //輸出1
        
        System.out.println(p2.id);        //輸出1
        
        System.out.println(Person.sum);    //輸出2 靜態變量可以通過類名訪問
    }
}

Person.java
Person.java

 

操作符& |

&&&都是與操作,那么有什么區別呢?

public class Test
{
    public static void main(String[] args)
    {
        int a = -1, b = -1;
        if ((a = 0) == 1 && (b = 1) == 1)
        {}
        System.out.println(a);    //輸出0賦值成功
        System.out.println(b);    //輸出-1賦值失敗
        
        a = -1;    b = -1;
        if ((a = 0) == 1 & (b = 1) == 1)
        {}
        System.out.println(a);    //輸出0賦值成功
        System.out.println(b);    //輸出1賦值成功
    }
}
Test.java

可以看到,當第一條件判斷為false的時候,&&是不會繼續執行、判斷第二個條件的,但&會。|也同理。

 

==操作符與equals()方法

這個已經被坑過很多很多次了。String的比較全部用equals()不能用==就一定不會錯……

若是基本類型,如int,double,string等等,用==就可以比較相等。

若是引用類型,如String,Integer或自己寫的類等等,用==比較的是是否同一個對象(內存地址是否相同),但我們一般要比價的是內容,所以應該有equals()方法。

public class Test
{
    public static void main(String[] args)
    {
        String s1 = "123", s2 = "123";
        
        String s3 = new String("123"), s4 = new String("123");
        
        String s5 = s3;
        
        System.out.println(s1 == s2);        //true
        
        System.out.println(s3 == s4);        //false
        
        System.out.println(s3 == s5);        //true
        
        System.out.println(s3.equals(s4));    //true
        
        Integer i1 = new Integer(1), i2 = new Integer(1);
        
        System.out.println(i1 == i2);        //false
        
        System.out.println(i1.equals(i2));    //true
    }
}
Test.java

必要時可以覆蓋equals()方法

public class Student
{
    public String name;
    
    public int age;
    
    public boolean equals(Object o)
    {
        if (this == o)
            return true;
        if (!(o instanceof Student))        //判斷是否Student的實例
            return false;
        
        final Student student = (Student)o;    //強制類型轉換
        
        return this.name.equals(student.name);
    }
    
    public Student(String name, int age)
    {
        this.name = name;
        
        this.age = age;
    }
    
    public static void main(String[] args)
    {
        Student m1 = new Student("Norcy", 22), m2 = new Student("Fiona", 21), m3 = new Student("Norcy", 23);
        
        System.out.println(m1.equals(m2));    //false
        
        System.out.println(m1.equals(m3));    //true
    }
    
}
Student.java

注意,在重寫equals方法時,要注意滿足離散數學上的特性:
1.自反性:對任意引用值X,x.equals(x)的返回值一定為true
2.對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true
3.傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4.一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5.非空性:任何非空的引用值X,x.equals(null)的返回值一定為false

instanceof操作符

判斷一個對象是否為一個類的實例。

假如s1Student類的實例,那么對於表達式“s instanceof XXX,XXX為以下值的時候,表達式的值為true.

  • Student
  • Student的直接父類或間接父類(即祖先)
  • Student類實現的接口的名字(接口是什么,以后再學)

4種訪問控制級別

public    對外公開

protected  向子類和同一個包中的所有類公開

默認     向同一個包中的所有類公開

private     只有類本身可以訪問,不對外公開

 

訪問級別:public > protected > default > private

若一個子類與父類在不同包,則這種情況屬於不同包,不屬於子類。

訪問級別

同類

同包

子類

不同包

public

protected

默認

private


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM