Day20-內部類

總結:

靜態內部類:

                不依賴外部類對象,可直接創建或通過類名訪問

                Outer.Inner in=new Outer.Inner();

局部內部類:

                定義在外部類的方法中,作用範圍的創建對象的範圍僅限於當前方法中

                局部內部類訪問外部類局部變量時,因無法保障變量的生命週期與自身相同,默認加上final

                隱藏類的信息、限制類的適用範圍。

匿名內部類:

                必須繼承一個父類或者實現一個接口。

                定義類、實現類、創建對象語法合併,只能創建一個該類對象

                書寫思路流暢,可讀性差。

Object:

                getClass()  :獲得對象的真實類型

                hashCode()  :保證相同對象返回相同的值,儘量保證不同對象返回不同哈希碼

                toString()  :getClass+@+hashCode

                equals()  :值

                                   默認實現爲(this==obj),比較兩個對象地址的內容時候相同。

 

習題:

C9.2:  寫出下列代碼的運行結果:

class Student{
    private int age;
    private String name;
    public Student(){}
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){
        return name+" "+age;
    }
}

public class TestStudent{
    public sattic void main(String[] args){
        Student stu1=new Student();
        Student stu2=new Student("Tom",18);
        System.out.println(stu1);
        System.out.println(stu2);
    }
}

                null 0

                Tom 18

 

C9.3:  寫結果:

public class TestEquals{
    public static void main(String[] args){
        String str1=new String("Hello");
        String str2=new String("Hello");
        System.out.println(str1.equals(str2));
        System.out.println(str1==str2);
    }
}

                true

                false

 

C9.4  寫結果:

class Animal{}
class Dog extends Animal{}
public class TestGetClass{
    public static void main(String[] args){
        Animal a1=new Dog();
        Animal a2=new Animal();
        System.out.println(a1 instanceof Animal);
        System.out.println( a1.getClass()==a2.getClass() );
    }
}

                true

                false

 

C9.5 Java中的內部類包括:

                成員內部類、靜態內部類、局部內部類、匿名內部類

 

 

C9.6 爲 Worker 類增加 equals 和 toString 方法

class Worker{
	String name;
	int age;
	double salary;

	//父類提供的方法無法滿足子類需求時,覆蓋之
	public String toString() {
		return "Worker [name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}

	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		if(obj==null){
			return false;
		}
		if(this.getClass()!=obj.getClass()){
			return false;
		}
		Worker ww=(Worker)obj;
		if(this.name.equals(ww.name) && this.age==ww.age && this.salary==ww.salary){
			return true;
		}
		return false;
	}
}

 

C9.9  有如下代碼:

class OuterClass{
    private int value1=100;
    private static int value2=200;
    public void method(int value3){
        final int value4=400;
        class InnerClass{
            public void print(){
            //1
            }
        }
    }
}

               //1:System.out.println(value1\2\3\4); jdk8會自己動加上final

 

 

C9.10  已知接口Light定義如下:

interface Light{
    void shine();
}
//定義Lamp類:
class Lamp{
    public void on(Light light){
        light.shine();
    }
}
//寫一個類TestLamp,部分代碼如下:
public class TestLamp{
    public static void main(String[] args){
        Lamp lamp=new Lamp();
        
        //1處使用局部內部類技術,調用lamp的on方法要求輸出“shine in red”
        class InnerRed implements Light{
            @Override
            public void shine() {
                System.out.println("shine in red");
            }
        }
        lamp.on(new InnerRed());
        
        //2處使用匿名內部類技術,調用lamp的on方法要求輸出“shine in yellow”
        lamp.on( new Light(){
            @Override
            public void shine() {
                System.out.println("shine in yellow");
            }} );
    }
}

               在//1處使用局部內部類技術,調用lamp的on方法要求輸出“shine in red”

               在//2處使用匿名內部類技術,調用lamp的on方法要求輸出“shine in yellow”

 

 

 

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