第10天----類的三大關係,Object,內部類,異常的簡介
阿新 • • 發佈:2018-12-13
* 昨天知識總結:
- 1.abstract
- 抽象類
- 抽象方法
- 2.interface
- 比較介面與抽象類
- 介面可以實現多繼承
- 抽象類除了抽象方法還可以有普通方法—可以有方法的呼叫
- 介面的定義
- 介面的構成
- 介面的注意點
- 介面中的新特性—正在jdk1.7後,介面中允許有static或default標註的方法可以存方法體
- 比較介面與抽象類
- 3.多型
- 多型的基礎
- 多型的優點
- 多型的向上轉型和向下轉型
- 多型的instanceof
- 多型成員使用
類與類的三種關係
- 類與類之間產生關係的三種方式:
- 傳參:
- 繼承:當可以使用誰是誰描述
- 組合:當可以使用誰擁有誰描述
- 傳參的耦合性更低,內聚性更高
Object常用的方法
- Object是的根類/父類
equals
- 使用equals方法實現比較
- equals預設比較的是兩個物件的地址
- 我們經常會重寫equals方法,按照自己的比較規則比較物件
hashCode
- hashCode:返回的是雜湊碼值,可以作為物件的唯一標識(身份證)
toString
- 預設返回的是物件的包名+類名[email protected]+雜湊碼值的十六進位制形式
- 輸出類的時候,預設呼叫的是toString方法
public class Test {
public static void main(String[] args) {
//根據輪子的個數比較兩輛車
Car car1 = new Car(5);
Car car2 = new Car(4);
boolean b = car1.comWithWheels(car2);
System.out.println(b);
//使用equals方法實現比較
//equals預設比較的是兩個物件的地址
//我們經常會重寫equals方法,按照自己的比較規則比較物件
boolean b1 = car1.equals(car2);
System.out.println(b1);
//hashCode:返回的是雜湊碼值,可以作為物件的唯一標識(身份證)
System.out.println(car1. hashCode() == car2.hashCode());
int value = car1.hashCode();
System.out.println(value);//雜湊碼值:2018699554 ,他是一個十進位制的數
//雜湊碼值的十六進位制形似
System.out.println(Integer.toHexString(car1.hashCode())); //7852e922雜湊碼值的十六進位制形式
//toString()方法:預設返回的是物件的包名+類名[email protected]+雜湊碼值的十六進位制形式
System.out.println(car1.toString());//[email protected]
//後期會經常重寫toString
//這裡預設呼叫toString
System.out.println(car1);
//getClass :瞭解內容
//作用:獲取當前物件的位元組碼檔案-----物件對應的型別是Class
Class class1 = car1.getClass();
System.out.println(class1);//class com.qianfeng.test.Car:位元組碼檔案的表示形式
//自己拼接toString方法的預設方法
System.out.println(class1.getName()+"@"+Integer.toHexString(car1.hashCode()));//[email protected]
}
}
class Car{
int wheelNumber;
public Car(int wheelNumber) {
super();
this.wheelNumber = wheelNumber;
}
public boolean comWithWheels(Car car) {
return this.wheelNumber > car.wheelNumber;
}
//通過重寫equels方法可以及自主制定比較規則
/*
* 問題:能不能將引數改成Car
* 答:不能,改完之後,這裡就不是重寫方法了,能夠實現功能,因為這個方法作為Car裡面一個獨立的方法被調出來了,與父類方法無關
*/
public boolean equals(Object obj) {
//容錯處理
if(!(obj instanceof Car)){
System.out.println("當前物件不是車類");
System.exit(0);
}
//向下轉型
Car car = (Car)obj;
return this.wheelNumber > car.wheelNumber;
}
//重寫toString:可以更加方便的檢視物件的屬性資訊
@Override
public String toString() {
return "Car [wheelNumber=" + wheelNumber + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
}
內部類
- 內部類:定義在A類內部的B類就是內部類,B類在A類內的地位相同,可以互相呼叫
- 內部類的作用
- 1.間接實現了多繼承
- 2.方便定義
- 3.只有外部類可以訪問建立的內部類的屬性和方法,包括私有方法
- 4.同一個包中其他類不可見,有了很好的封裝性
class Outer{
int age;
class Inner{//內部類
int height;
public void play() {
System.out.println("Inner-play");
}
}
public void show() {
//在外部類的方法中呼叫內部類
Inner inner = new Inner();
System.out.println("show");
}
}
建立內部類的兩種方式
- 第一種方法:藉助於外部類的方法呼叫,實現內部類的呼叫
public class Test {
public static void main(String[] args) {
//第一種方法:藉助於外部類的方法呼叫,實現內部類的呼叫
Outer outer = new Outer();
outer.show();
}
}
- 第二種方式:直接實現內部類
- 建立內部類物件的方式:外部類的物件.new 內部類的構造方法
- Outer.Inner:獲取內部類的方式
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
//第二種方式:直接實現內部類
//建立內部類物件的方式:外部類的物件.new 內部類的構造方法
//Outer.Inner:獲取內部類的方式
Outer.Inner inner = outer.new Inner();
inner.play();
}
}
區域性內部類
- 區域性內部類:定義在一個類方法中的類
- 作用範圍:從定義區域性內部類開始到show方法結束
- 作用:對於當前的區域性內部類所在的方法,相當於將他的一部分功能面向物件了,形成了區域性內部類,這樣既保證了程式碼的私有化你,又對程式碼進行了重新的整理,增加了程式碼的可讀性,可操作性,簡化程式碼,增加了複用性。
- 例項 :要求將兩個功能變成play的私有功能
- 我們通過區域性內部類實現了功能私有化,並對方法內部的程式碼進行了整理,增強了程式碼的可讀性和可操作性
public class Demo5 {
public void play() {
class Inner{
//因為方法的定義之間是不能巢狀的,所以必須通過區域性內部類實現
public void gongneng1() {
System.out.println("gongneng1");
}
public void gongneng2() {
System.out.println("gongneng2");
}
}
Inner inner = new Inner();
inner.gongneng1();
inner.gongneng2();
}
public void show() {
//無法呼叫,因為這兩個方法是play方法的區域性內部類的方法
// gongneng1();
// gongneng2();
}
}
- 靜態內部類
- 注意點
- 1.靜態內部類中可以沒有靜態成員
- 2.有靜態成員的一定是靜態內部類
- 靜態內部類的物件的建立
- 注意:要保證內部類本身是靜態的
- 構成:new 外部類,內部類的構造方法
public class Demo7 {
public static void main(String[] args) {
//工作
//靜態的物件
//注意:要保證內部類本身是靜態的
//構成:new 外部類,內部類的構造方法
Outer3.Inner inner = new Outer3.Inner();
//呼叫方法
inner.play();
inner.show();
Outer3.Inner.show();
}
}
class Outer3{
static class Inner{//靜態內部類
//非靜態的方法
public void play() {
System.out.println("非靜態的方法:play");
}
//靜態的方法
public static void show() {
System.out.println("靜態的方法-show");
}
}
}
匿名內部類
- 匿名內部類(物件):定義在一個類的方法中的匿名子類物件,屬於區域性內部類
- 1.匿名子類物件
- 2.匿名的內部類物件
- 建立匿名內部類物件注意點1.匿名內部類必須有父類或父介面
- 匿名內部類物件的作用
- 1.當只用到當前子類的一個例項物件的時候,定義好馬上使用
- 2.當不好起的名字的時候
- 3.可以更好的定義執行時的回撥(知道即可)
public class Text{
public static void main(String[] args) {
Out out = new Out();
out.show();
out.testCanshu1();
out.testCanshu2();
Tests tests1 = out.testFanhuizhi();
System.out.println(tests1);
Tests tests2 = out.testFanhuizhi2();
tests2.testMethod();
// tests2.play;
System.out.println(tests2);
}
}
//研究匿名內部類
class Tests{
public void testMethod() {
System.out.println("Tests-testMethod");
}
}
class Out{
public void show() {
new Tests() {//匿名內部類
public void testMethod() {
System.out.println("沒有名字-testMethod");
play();
}
//自己的方法
public void play() {
System.out.println("沒有名字-play");
}
}.testMethod();
}
//普通的匿名物件充當方法
public void testCanshu1() {
System.out.println(new Tests());
}
//使用匿名的子類物件充當引數
public void testCanshu2() {
System.out.println(new Tests() {
public void testMethod() {
System.out.println("沒有名字-testMethod");
play();
}
//自己的方法
public void play() {
System.out.println("沒有名字-play");
}
}
);
}
//普通的匿名物件作返回值
public Tests testFanhuizhi(){
return new Tests();
}
//使用匿名的內部類充當返回值
public Tests testFanhuizhi2(){
return new Tests() {
public void testMethod() {
System.out.println("沒有名字-testMethod");
play();
}
//自己的方法
public void play() {
System.out.println("沒有名字-play");
}
};
}
//練習:建立介面的匿名內部類
}
異常簡介
- 異常:程式中出現的不正常情況,
- 異常:程式在執行過程中不正常的情況,程式將他進行了屬性和行為(異常的位置,原因,名字等)的抽象,提取,形成了物件。
- 形成了各種異常類
- 異常的分類:
- throwable(異常類)
- 1.error:叫錯誤,程式執行過程中出現的嚴重問題,我們不需要去修改
- 2.Exception:我們平時稱的異常,程式在執行過程中出現的不嚴重的問題,我們可以去修改
- Exception分類:
- 第一種分類方式:編譯異常:在編譯階段丟擲異常,處理異常
- 執行時異常:在執行階段丟擲異常,處理異常
- 第二種分類方式:系統異常:系統提前定義好的,我們直接拿來使用
- 自定義異常:需要我們自定義的
- throwable(異常類)
- 異常的正常處理
public class Demo9 {
public static void main(String[] args) {//4.這裡也沒有處理異常的能力,將異常物件向上拋,拋給JVM(Java虛擬機器)
//JVM的處理方法:呼叫異常物件的列印方法,將異常資訊列印到控制檯
Math math = new Math();
int value = math.div(3,0);//3.這裡也沒有處理異常的能力,將異常物件向上拋
System.out.println(value);
}
}
class Math{
public int div(int a,int b) {//2.這裡也沒有處理異常的能力,將異常物件向上拋
return a/b;//1.建立除數為零的異常物件(ArithmeticException()),
//這裡沒有處理異常的能力,將異常物件向上拋,拋給他所在的方法
}
}