總結:
靜態內部類:
不依賴外部類對象,可直接創建或通過類名訪問
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”