Nested Class
一、Inner classes
Inner classes()
1.常规内部类中的方法可以直接使用外部类的实例变量和实例方法。
2.在常规内部类中可以直接用内部类创建对象
3.创建对象是用DogHouse dh=Dog.new DogHouse();
Method local Inner classes(在方法内使用)
1.局部内部类只在方法体中有效,就想定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象
2.在方法内部定义类时,应注意以下问题:
a.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和 abstract修饰
b.方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。
c.static方法中定义的内部类可以访问外部类定义的static成员
Anonymous Inner classes(匿名内部类,只使用一次)
没有名称,类被创建的同时也被new。
二、Static Nested classes
1.静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。
2.由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,但是可以访问外部类中的static成员。这与一般类的static方法相通
例子:
package com.qingke_java.NestedClass;
interface Food{
public void beEat();
}
public class Dog {
private String name;
private int height;
private DogHouse dogHouse;
public Dog(String name,int height){
this.name=name;
this.height=height;
dogHouse=new DogHouse(height);
}
public void eat(Food food){
food.beEat();
}
public void run(){
System.out.println(name+"开跑啦!!!");
//方法体内的内部类
class Dog Shoes{
public Dog Shoes(){
System.out.println("创建了一双狗鞋");
}
public void accelerate(){
System.out.println("开始加速了!");
}
}
DogShoes ds=newDogShoes();
ds.accelerate();
System.out.println(name+"跑完啦!!!");
}
//普通内部类
public class DogHouse{
public DogHouse(int height){
System.out.println("造了一个高为"+height+"的狗窝");
}
public void furnish(){
System.out.println("给"+name+"造了一个狗窝");
}
}
//静态内部类
public static class DogStatu{
public DogStatu(){
}
public void dogNum(){
System.out.println("总共有1234条小白狗!!!");
}
}
public void wong(){
System.out.println("My name is "+name);
System.out.println("I am "+height);
System.out.println("I hava a house");
}
public static void main(String[]args){
Dog dog=newDog("小白",65);
dog.wong();
System.out.println("=========================");
Dog.DogHouse dh=dog.newDogHouse(65);
dh.furnish();
System.out.println("=========================");
dog.run();
System.out.println("=========================");
//匿名内部类,相当于new了一个实现Food接口的类
//匿名内部类写法一
Food food=new Food(){
public void beEat() {
System.out.println("我被吃了");
}
};
dog.eat(food);
//匿名内部类写法二
dog.eat(new Food(){
public void beEat() {
System.out.println("我又被吃了");
}
});
System.out.println("================================");
//new静态内部类的new
Dog.DogStatu ds=new DogStatu();
ds.dogNum();
}
}