Java學習筆記(續)

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)。

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