关于内部类的使用,我们只需要搞懂三个问题就可以了:
- 如何实例化内部类中的成员对象
- 如何在成员内部类中区分调用外部类的结构
- 在我们实际开发当中局部内部类的具体使用 ```java public class InnerClassTest {
}
class Person{
}
//静态成员内部类
static class Dog{
}
//非静态成员内部类
class Bird{
}
public void method(){
//局部内部类 方法内
class AA{
}
}
{
//局部内部类 代码块内
class BB{
}
}
public Person(){
//局部内部类 构造器内
class CC{
}
}
}
需要注意的事项:<br />1.非static的成员内部类中的成员不能声明为static的,只有在外部类或static的成员内部类中才可声明static成员<br />2.外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式<br /> 换句话说(内部类是实例不能单独存在,必须依赖于一个外部实例的引用)<br />3.成员内部类可以直接使用外部类的所有成员,包括私有的数据<br />4.当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
```java
class Person{
static String name = "小明"; //因为这是在外部类里面所以可以声明称static的
int age;
public void eat(){
System.out.println("人:吃饭");
}
public static void f(){
System.out.println("见4. "+new Dog().name);
}
//静态成员内部类
static class Dog{
String name= "卡拉";
int age;
public void show(){
System.out.println("卡拉是条狗");
// 因为eat()不是静态的方法
//! eat();
}
}
//非静态成员内部类
class Bird{
String name = "杜鹃";
public Bird(){}
public void sing(){
System.out.println("我是一只小小鸟");
// 3.成员内部类可以直接使用外部类的所有成员,包括私有的数据
Person.this.eat();//调用外部类的非静态属性
eat();
System.out.println(age); //会被初始化
}
public void display(String name){
System.out.println(name);//方法的形参
System.out.println(this.name);//内部类的属性
System.out.println(Person.this.name);//外部类的属性
// 如果外部类name是static直接Person.name即可
}
}
}
public class InnerClassTest {
public static void main(String[] args) {
//创建Dog实例(静态的成员内部类):
Person.Dog dog = new Person.Dog();
dog.show();
//创建Bird实例(非静态的成员内部类):
//错误的:因为没有外部类对象实例,所以不能这样直接调用
//Person.Bird bird = new Person.Bird();
//创建外部类实例
Person p = new Person();
Person.Bird bird = p.new Bird(); // 2.外部类访问成员内部类的成员,
需要“内部类.成员”或“内部类对象.成员”的方式
bird.sing();
Person.f(); //4.当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
System.out.println();
bird.display("黄鹂");
}
}
输出:
人:吃饭
人:吃饭
0
见4. 卡拉
黄鹂
杜鹃
小明