Java SE Lesson 3
1. 接口中所聲明的方法都是抽象方法。接口中的方法都是public的。
2. 接口中也可以定義成員變量。接口中的成員變量都是public、final、static的。
public interface InterfaceTest
{
int a = 1;
}
3. 一個類不能既是final,又是abstract的。因爲abstract的主要目的是定義一種約定,讓子類去實現這種約定,而final表示該類不能被繼承,這樣abstract希望該類可以被繼承而final明確說明該類不能被繼承,兩者矛盾。因此一個類不能既是final的,又是abstract的。
public abstract final Test//編譯錯誤,一個類不能既是final,又是abstract的
{
}
4. Design Pattern(設計模式)。單例模式(Singleton):表示一個類只會生成唯一的一個對象。
public class SingletonTest
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton == singleton2);
}
}
class Singleton
{
private static Singleton singleton = new Singleton();;
private Singleton()
{
}
public static Singleton getInstance() //因爲private,使用static讓外部可以直接用類名調用
{
return singleton;
}
}
5. 包(package)。用於將完成不同功能的類分門別類,放在不同的目錄(包)下。包的命名規則:將公司域名反轉作爲包名。www.shengsiyuan.com,com.shengsiyuan(包名),對於包名:每個字母都需要小寫。如果定義類的時候沒有使用package,那麼Java就認爲我們所定義的類位於默認包裏面(default package)。
package com.shengsiyuan; //包名
public class PackageTest
{
public static void main(String[] args)
{
System.out.println(“hello word!”);
}
}
6. 編譯帶有package聲明的Java源文件有兩種方式:
a) 直接編譯,然後根據類中所定義的包名,逐一手工建立目錄結構,最後將生成的class文件放到該目錄結構中(很少使用,比較麻煩)。
b) 使用編譯參數–d,方式爲javac –d . 源文件.java,這樣在編譯後,編譯會自動幫助我們建立好包所對應的目錄結構。
7. 有兩個包名,分別是aa.bb.cc與aa.bb.cc.dd,那麼我們稱後者爲前者的子包。
8. 導入(import),將使用package分離的各個類導入回來,讓編譯器能夠找到所需要的類。
9. import的語法:import com.shengsiyuan.PackageTest;
10. import com.shengsiyuan.*,表示導入com.shengsiyuan包下面的所有類。
11. import aa.bb.*並不會導入aa.bb.cc包下面的類。這時需要這樣寫:
import aa.bb.*;
import aa.bb.cc.*;
例:
Import com.shengsiyuan.test.*;
public class ImportTest
{
public static void main(String[] args)
{
System.out.println(PackageTest.i);
}
}
12. 關於package、import、class的順序問題:
a) 首先需要定義包(package),可選
b) 接下來使用import進行導入,可選
c) 然後纔是class或interface的定義。
13. 如果兩個類在同一個包下面,那麼則不需要導入,直接使用即可。
14. 訪問修飾符(access modifier)。
1) public(公共的):被public所修飾的屬性和方法可以被所有類訪問。
2) protected(受保護的):被protected所修飾的屬性和方法可以在類內部、相同包以及該類的子類所訪問。
3) private(私有的):被private所修飾的屬性和方法只能在該類內部使用
4)默認的(不加任何訪問修飾符):在類內部以及相同包下面的類所使用。
15. instanceof:判斷某個對象是否是某個類的實例。語法形式:引用名 instanceof 類名(接口名),返回一個boolean值。
public class InstanceofTest
{
public static void main(String[] args)
{
People people = new Man();
System.out.println(people instanceof People); //結果爲true,因爲Man是People的子類,根據繼承,子類就是父類,因此Man也可以看作是People的實例。
}
}
class People
{
}
class Man extends People
{
}
16. People people = new Man();
17. System.out.println(people instanceof People); //結果爲true,因爲Man是People的子類,根據繼承,子類就是父類,因此Man也可以看作是People的實例。
18. 相等性的比較(==)
1)對於原生數據類型來說,比較的是左右兩邊的值是否相等。
2)對於引用類型來說,比較左右兩邊的引用是否指向同一個對象,或者說左右兩邊的引用地址是否相同。
19. java.lang.Object類。java.lang包在使用的時候無需顯式導入,編譯時由編譯器自動幫助我們導入。
20. API (Application Programming Interface),應用編程接口。
21. 當打印引用時,實際上會打印出引用所指對象的toString()方法的返回值,因爲每個類都直接或間接地繼承自Object,而Object類中定義了toString(),因此每個類都有toString()這個方法。
22. 關於進制的表示:16進制,逢16進一,16進制的數字包括:0~9,A,B,C,D,E,F,
public class ObjectTest
{
public static void main(String[] args)
{
Object object = new Object();
System.out.println(object);
System.out.println(object.toString());
String str = "aaa";
System.out.println(str);
System.out.println(str.toString());
Student student = new Student();
System.out.println(student);
System.out.println(student.toString());
}
}
class Student extends Object
{
public String toString()
{
return "Hello World";
}
}
23. equals()方法,該方法定義在Object類當中,因此Java中的每個類都具有該方法,對於Object類的equals()方法來說,它是判斷調用equals()方法的引用與傳進來的引用是否一致,即這兩個引用是否指向的是同一個對象。對於Object類的equals()方法來說,它等價於==。
24.對於String類的equals()方法來說,它是判斷當前字符串與傳進來的字符串的內容是否一致。
25. 對於String對象的相等性判斷來說,請使用equals()方法,而不要使用==。
public class StringTest
{
public static void main(String[] args)
{
String str = new String("aa");
String str2 = new String("aa");
System.out.println(str.equals(str2));
String str3 = "aa";
String str4 = "aa";
System.out.println(str3.equals(str4));
System.out.println("-----------------");
Object object = new Object();
Object object2 = new Object();
System.out.println(object.equals(object2));
System.out.println(object.equals(object));
System.out.println("-----------------");
}
}
public class EqualsTest
{
public static void main(String[] args)
{
Student s1 = new Student("zhangsan");
Student s2 = new Student("zhangsan");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
class Student
{
String name;
public Student(String name)
{
this.name = name;
}
public boolean equals(Object anObject)
{
if(this == anObject)
{
return true;
}
if(anObject instanceof Student)
{
Student student = (Student)anObject;
if(student.name.equals(this.name))
{
return true;
}
}
return false;
}
}
26. String是常量,其對象一旦創建完畢就無法改變。當使用+拼接字符串時,會生成新的String對象,而不是向原有的String對象追加內容。
public class StringTest2
{
public static void main(String[] args)
{
String s1 = "hello";
String s2 = " world";
String s3 = s1 + s2;
System.out.println(s3);
}
}
27. String Pool(字符串池)
28. String s = “aaa”;(採用字面值方式賦值)
1) 查找String Pool中是否存在“aaa”這個對象,如果不存在,則在String Pool中創建一個“aaa”對象,然後將String Pool中的這個“aaa”對象的地址返回來,賦給引用變量s,這樣s會指向String Pool中的這個“aaa”字符串對象
2) 如果存在,則不創建任何對象,直接將String Pool中的這個“aaa”對象地址返回來,賦給s引用。
29. String s = new String(“aaa”);
1) 首先在String Pool中查找有沒有“aaa”這個字符串對象,如果有,則不在String Pool中再去創建“aaa”這個對象了,直接在堆中(heap)中創建一個“aaa”字符串對象,然後將堆中的這個“aaa”對象的地址返回來,賦給s引用,導致s指向了堆中創建的這個“aaa”字符串對象。
2) 如果沒有,則首先在String Pool中創建一個“aaa“對象,然後再在堆中(heap)創建一個”aaa“對象,然後將堆中的這個”aaa“對象的地址返回來,賦給s引用,導致s指向了堆中所創建的這個”aaa“對象。
public class ObjectTest2
{
public static void main(String[] args)
{
Object object = new Object();
Object object2 = new Object();
System.out.println(object == object2);//false
System.out.println("----------------");
String str = new String("aaa");
String str2 = new String("aaa");
System.out.println(str == str2);//false
System.out.println("----------------");
String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3 == str4);//true
System.out.println("----------------");
String str5 = new String("ccc");
String str6 = "ccc";
System.out.println(str5 == str6);//lse
System.out.println("----------------");
String s = "hello";
String s1 = "hel";
String s2 = "lo";
System.out.println(s == s1 + s2);//lse
System.out.println("----------------");
System.out.println(s == "hel" + "lo");//true
}
}