封裝:
是将資料和行為組合在一個包内,并對對象的使用者隐藏了資料的實作形式。
封裝是把一個對象的屬性私有化,同時提供一些可以被外界通路屬性的方法!
優點:可以對成員進行更精确的控制。隐藏資訊,實作細節。
因為基礎類型在棧中存儲值,**封裝類型在棧中存儲引用(對象),在隊中存儲值!**确實比基礎類型存儲起來要麻煩得多,但是保證了安全性以及複用性!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLy0kaNl3Y65UMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwIjM1MDN0UTMzEjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
private可以修飾成員變量也可以修飾成員方法;
修飾成員變量時,隻能被本類通路,不可以被外部通路。
1.自動裝箱和自動拆箱:
float f = 66.6f;
//自動裝箱
Float f1 = new Float(f);
//自動拆箱
Float f2 = f;
Double d = new Double(88.88);
//手動拆箱
double d1 = d.doubleValue();
//自動拆箱
int score = 67;
//裝箱(封裝)
Integer score1 = new Integer(score);
//拆箱并轉換類型
double score2 = score1.doubleValue();
float score3 = score1.floatValue();
int score4 = score1.intValue();
2.轉化成String的方法,以及str轉化成double的方法:
double a = 78.5;
//轉化成String的方法
String str = String.valueOf(a);
System.out.println("str + 12 的結果為: "+(str + 12));
String str1 = "180.20";
//str轉化成Double以及Int的方法
Double dd = Double.parseDouble(str1);
System.out.println("d + 100 的結果為: "+ (dd + 100));
3.使用場景:
(1)類型轉化:
String b = “123”;//如果含有非法字元,則會報錯!
Int c = Integer.parseInt(b);
(2)泛型中使用:
List<>為原始類型,不指定元素類型時,會警告;是以List的<>中應該指定清楚的類型,如Integer,String等!
(3)強制類型轉化;
4.優點
(1)類内部的就夠可以自由修改;
(2)可以對成員變量進行更精确的控制!
(3)隐藏資訊,實作細節,代碼複用性極強!
5.泛型:
//不使用泛型:
List list1 = new ArrayList();
list1.add(“www.educoder.net”);
String str1 = (String)list1.get(0);
使用泛型:
List list2 = new ArrayList();
list2.add(“www.educoder.net”);
String str2 = list.get(0); //可以發現在這裡我們不用強制類型轉化
提高性能,代碼更安全
繼承:
class 子類名extends父類名 [implements <接口名>]{}//extends就是子類繼承父類
(java.lang.)Object 類。//預設定義的所有類的父類
Java中隻能繼承一個父類
1.子類繼承父類中已有的成員變量和方法;
2.子類可以增加父類中沒有的變量和方法,或修改父類中已有的變量和方法。
3.方法覆寫(方法重寫)指子類的方法與父類的方法名相同,方法的傳回值類型、入口參數的數目、類型、順序均相同,隻是方法實作的功能不同,此時父類的方法被覆寫。
4.方法重載:同一個類中類名相同,方法體不同,參數不同;
5.this關鍵字的使用:
(1) 調用成員變量
(2) 調用成員方法
(3) 調用構造方法
(4)區分成員變量和局部變量
(5)傳回執行個體對象本身的使用
(6)在構造方法中使用其他構造方法
(7) 對象的比較:
// 調用此方法時裡面存在兩個對象:目前對象、傳入的對象
Person p1 = this ; // 目前的對象,就表示per1
Person p2 = per ; // 傳遞進來的對象,就表示per2
if(p1==p2){ // 判斷是不是同一個對象,用位址比較
return true ;
}
6.super的使用:(通路父類被隐藏的變量以及覆寫父類方法)
super.talk(), super.a;
//1.調用父類構造方法
//2.調用父類被覆寫的方法
//3.通路父類中被隐藏的成員變量
注意:
父類不含無參構造方法時子類構造方法必須顯式調用父類帶參構造方法,因為子類執行個體化的時候先需要執行個體化父類
例:
package tett;
public class Ex_SuperUse {
static int n = 10;//A行
public static void main(String[] args){
SubClass sc2 = new SubClass(n);
}
}
class SuperClass{
private int n;
SuperClass(int n){
System.out.println("SubClass("+n+")");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(int n){
super(n);
//就是說當父類有無參構造方法時,子類構造方法會隐式的調用它,是以可以不寫,但是當父類有有參構造方法時,子類有參構造方法必須調用它,并用super調用它!
System.out.println("SubClass("+n+")");
}
}
7.對象類型轉換:
Animal animal = new Dog();
Dog dog = (Dog) animal; // 向下轉型,把Animal類型轉換為Dog類型
Creature creature = animal; // 向上轉型,把Animal類型轉換為Creature類型
1.向上轉型:
(1)//父類有的子類也有的才可以調用
(2)上轉型對象不能操作子類新增加的成員變量和成員方法。
(3)上轉型對象可以代替子類對象調用子類重寫的執行個體方法。
(4)上轉型對象可以調用子類繼承的成員變量和隐藏的成員變量。
//繼承成員變量:父類int a; 子類 int a;
//隐藏成員變量:父類int a; 子類 double a;
子類對象向上轉型為父類對象是安全的。
2.向下轉型:
(1)//可以調用子類的所有方法(包括父類的方法)
(2)向下轉型對象通路重寫父類的方法時,操作的是子類的方法。
(3)向下轉型對象可以操作父類及子類成員變量和成員方法。
(4)向下轉型必須保證父類對象引用的是該子類的對象,如果引用的是父類的其他子類對象,會抛出類型不比對異常。
注意::父類對象向下轉為子類對象是不安全的;編譯不會出錯,但是運作時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,隻有先經過向上轉型的對象才能繼續向下轉型。
多态:(通過繼承和接口實作多态)
定義:即不同類的對象收到相同的消息時,得到不同的結果。
即多态性也分靜态多态性(編譯時的多态)和動态多态性(運作時的多态);
靜态多态性是指定義在一個類或一個函數中的同名函數,它們根據參數表(類型以及個數)差別語義和執行的功能。
動态多态性是指定義在一個類層次的不同類中的重載函數,它們具有相同的函數原型,需要根據指針指向的對象所在類來差別語義,它通過動态聯編實作。
非通路控制符:
除了可以使用 public、private、protected 和預設來設定類成員變量,還可以使用 static、final、abstract 等說明成員變量或方法的特性。