- Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B就是外部类
- 内部类的分类:成员内部类(静态、非静态)vs局部内部类(方法内、代码块内、构造器内)
成员内部类
1、一方面,作为外部类的成员。①、调用外部类的结构。②、可以被static修饰。③可以被四种不同的权限修饰。
2、另一方面,作为一个类。①、可以定义属性、方法、构造器等。②可以被final修饰,表示此类不能被继承。③可以被abstract修饰
package com.atguigu.java8;
public class InnerClassTest {
}
class Person{
String name;
int age;
public void eat() {
System.out.println("人吃饭");
}
//静态成员内部类
static class Dog{
String name;
int age;
public void show() {
System.out.println("我是狗");
}
}
//非静态成员内部类
class Bird{
String name;
public Bird() {
}
public void sing() {
System.out.println("我是一只小小鸟");
Person.this.eat();//调用外部类的非静态属性
}
}
}
局部内部类
- 内部类的实例化问题
- 如何在内部类中区分调用外部类的结构
- 开发中局部内部类的使用
package com.atguigu.java8;
public class InnerClassTest {
public static void main(String[] args) {
//1、内部类的实例化问题
//实例化静态成员内部类
Person.Dog dog = new Person.Dog();
dog.show();
//实例化非静态成员内部类
Person p = new Person();
Person.Bird bird = p.new Bird();
bird.sing();
}
}
class Person{
String name;
int age;
public void eat() {
System.out.println("人吃饭");
}
//静态成员内部类
static class Dog{
String name;
int age;
public void show() {
System.out.println("我是狗");
}
}
//非静态成员内部类
class Bird{
String name;
public Bird() {
}
public void sing() {
System.out.println("我是一只小小鸟");
Person.this.eat();//调用外部类的非静态属性
}
//2、如何在内部类中区分调用外部类的结构
public void display(String name) {
System.out.println(name); //传入的形参
System.out.println(this.name); //内部类的name
System.out.println(Person.this.name); //外部类的name
}
}
}
package com.atguigu.java8;
//3、开发中局部内部类的使用
public class InnerClassTest1 {
//返回一个实现了Comparable接口的类的对象
public Comparable getComparable() {
//创建一个实现了Comparable接口的类:局部内部类
//方式一:
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
return new MyComparable();
//方式二:
return new Comparable() {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
}
}
网友评论