Java學習筆記(續)
續前一章
2.2 Java中的權限修飾符的介紹
public |
protected |
(default) |
private |
|
---|---|---|---|---|
同一個類 | ✔ | ✔ | ✔ | ✔ |
同一個包 | ✔ | ✔ | ✔ | ✘ |
不同的包是子類 | ✔ | ✔ | ✘ | ✘ |
不同的包且不是子類 | ✔ | ✘ | ✘ | ✘ |
final
:final放在類前面修飾,表示final類,不能被繼承,放在方法前面,表示這個方法不可以被該類的子類進行方法重寫,用於修飾局部變量,只能賦值一次,後面不能對該變量進行修改,如果是基本數據類型,就是其值不能改變,如果是引用數據類型,就是其值(地址)不能發生改變,如果是放在成員變量之前修飾,那就是成員變量不能夠更改,要麼在成員變量定義時給定初值,要麼將出現的所有的構造方法都需要對其成員變量進行賦值操作,只有一次。
2.3成員內部類
成員內部類的使用方式如:
/*
成員內部類直接定義在外部類的裏面,格式如:
public class Test{
public class InnerClass{
...
}
....
}
*/
public class A{
String username;
public A{
}
public String getUsername(){
return this.username;
}
public void setUsername(String username){
this.username=username;
}
public class B{
System.out.println("Hello InnerClassB");
}
public void Test(){
B b=new b();
b.username="hello";
}
}
內部類的訪問方式有兩種:
間接使用
:在創建外部類的時候,通過調用外部類的方法(方法內部包含了使用內部類的創建),就實現了內部類的創建和使用。
直接使用
:外部類.內部類 對象名稱=new 外部類().new 內部類();
/*如上述所寫代碼*/
A.B test=new A().new B();
2.4局部變量,成員變量,外部類成員變量,父類成員變量同名時候的訪問
在類的繼承中,存在有成員變量,父類成員變量,局部變量變量名相同的問題,爲了區分三個不同變量的使用,需要使用相應的關鍵字。
/*
父類A,子類B,方法test中都存在一個相同的變量username
*/
//父類
public class A{
String username;
}
//子類
public class B extends A{
String username;
public void Test(){
String username;
System.out.println(username);//訪問方法體內部的局部變量username
System.out.println(this.username);//訪問子類B中的成員變量username
System.out.println(super.username);//訪問子類B的父類A中的成員變量username
}
}
同理,在內部類中也存在,成員變量,內部類成員變量,局部變量變量名相同的問題,爲了區分三個不同變量的使用,需要使用相應的關鍵字。
/*
類(外部類)A,內部類B,方法Test中都存在一個相同的變量username
*/
public class A{
String username;
public class B{
String username;
public void Test(){
System.out.println(username);//訪問方法體內部的局部變量
System.out.println(this.username)//訪問內部類B中的成員變量
System.out.println(A.this.username)//訪問內部類的外部類A的成員變量
}
}
}
總結
:需要明白this的關健字的含義,誰使用this就指向誰。
2.5匿名內部類
備註
:如果接口的實現類,或者父類的子類只使用一次,可以直接使用匿名內部類,從而省略了接口實現類或者是子類的定義。
匿名內部類的定義方法爲:接口名稱 變量名=new 接口名稱(){重寫接口中的所有的抽象方法};
//接口A
public interface A{
public abstract int getId();
}
//測試類
/*
直接使用了匿名內部類,沒有使用接口的實現類
*/
public class Test{
public static void main(String args[]){
A a=new A(){
public int getId(){
return 1;
}
};
int id=a.getId();
System.out.println(id);
}
}
/*
否則需要接口的實現類
*/
public class B implements A{
public int getId(){
return 1;
}
}
//測試類
public class Test{
public static void main(String args[]){
A a=new B();
int id=a.getId();
System.out.println(id);
}
}
注意
匿名內部類在創建對象的時候只能出現一次,如果對象內部內容一樣,也需要多次寫。
區分以下匿名對象和匿名內部類:
匿名對象是省略了對象名稱,匿名類是省略了類的名稱,其中匿名對象new A()
,左邊沒有,表示匿名對象,而匿名內部類如前述所示,沒有創建這個類。
1 Object類的toString方法
每一個類,調用System.out.println(對象名),默認打印的是對象的地址值,如果不是地址值,就是重寫了toString()方法。
Objects.euqals(s1,s2);比較兩個對象是否相等,可以防止空指針異常。
==比較,如果是基本數據類型比較,就直接比較的是數值的大小,而如果是引用類型,比較的就是變量的地址值是否相等。
Object.equals(Object2);可以比較值得內容是否相等。
String s1="hello";
String s2="Hello";
char[] s=new char[]{'h','e','l','l','o'};
String s3=new String(s);
System.out.println(s1==s2);//false
System.out.println(s1==s3);//false
System.out.println(s2==s3);//false
System.out.println(s2.equals(s3));//false
System.out.println(s1.equals(s3));//true
System.out.println(s1.equals(s2));//false
System.out.println(Objects.equals(s1,s3));//true
2 Data類(表示日期和時間的類)
Date date=new Date();
System.out.println(date);
long Seconds=date.getTime();
SimpleDateFormate s=new SimpleDateFormate("yyyy-MM-dd HH:mm:ss");
Date time=s.parse("2020-04-06: 16:26:50");
String stime=s.format(date);
需要注意的地方:
Date類中的getTime()函數是將當前時間轉換爲毫秒值,是一個long型的整形數據,是與1970年1月1日0點0分0秒的毫秒值的差值。
SimpleDateFormat是一個格式化時間的類,可以將時間轉換爲想要的字符串形式(format),和將字符串解析爲日期格式(parse)。