定义:
类内部定义的类
内部类的访问规则
可以直接访问外部类的成员,包括私有
外部类要想访问内部类成员,必须创建对象
内部类的分类
1):成员内部类:在成员变量或者成员方法位置定义的类
成员静态内部类:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
成员非静态内部类:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
private定义的成员内部类,不能直接访问,需要通过方法获取该类的对象
static 定义的类,可以看做外部类的成员变量;
2):局部内部类:在局部位置定义的类
局部内部类
局部内部类访问局部变量必须加final修饰 。
原先如下:
局部内部类定义在局部,而局部随着方法的消失而消失,局部定义的变量存储在栈中,随着方法调用结束而释放,但是类是在堆中,局部内部类调用局部变量,但是局部内部类发现找不到对应的变量了,所以我们要在局部内部类访问局部变量必须加final修饰 ,这样修饰后的变量还是存储在内存中,可以让局部内部类调用
public class Test {
private String name = "lisi";
private static String passw = "lisi";
// 成员内部类
class People {
public void method() {
System.out.println("成员非静态内部类");
System.out.println("可以访问外部name:" + name);
}
}
// 成员内部静态内部类,可以看做外部类成员
static class SuperPeople {
public void method() {
System.out.println("成员静态内部类");
System.out.println("可以访问外部passw:" + passw);
}
}
// private 成员内部类
private class UserPeople {
public void method() {
System.out.println("private成员内部类");
}
}
public UserPeople getUserPeople() {
return new UserPeople();
}
//
public void method3() {
//局部内部类
final String pass="hello";//局部内部类访问局部变量必须用final修饰
class Woman {
public void method() {
//
System.out.println("局部内部类"+name);
System.out.println("局部内部类访问局部变量必须用final修饰:"+pass);
}
}
//为了调用局部内部类方法
Woman woman=new Woman();
woman.method();
//匿名内部类
new HmanDao(){
@Override
public void login() {
System.out.println("匿名内部类HmanDao");
}
}.login();
//匿名内部类
new Hman(){
public void method() {
//
System.out.println("匿名内部类Hman");
}
}.method();
}
public static void main(String[] args) {
System.out
.println("----------------访问成员非静态内部类方法-----------------------------");
// 访问成员非静态内部类
Test.People up = new Test().new People();
up.method();
System.out
.println("----------------访问成员静态内部类方法-----------------------------");
// 访问成员静态内部类
Test.SuperPeople up2 = new Test.SuperPeople();
up2.method();
System.out
.println("----------------访问成员private内部类方法---------------------");
// 访问成员private内部类
UserPeople up3 = new Test().getUserPeople();
up3.method();
// 局部内部类
System.out.println("-------------访问局部内部类方法--------------------");
Test test = new Test();
test.method3();
}
}
interface HmanDao {
public static final int num = 1;//; only public, static & final are permitted
public void login();
}
class Hman {
public void method() {
System.out.println("Hman类");
}
}
输出:
----------------访问成员非静态内部类方法-----------------------------
成员非静态内部类
可以访问外部name:lisi
----------------访问成员静态内部类方法-----------------------------
成员静态内部类
可以访问外部passw:lisi
----------------访问成员private内部类方法---------------------
private成员内部类
-------------访问局部内部类方法--------------------
局部内部类lisi
局部内部类访问局部变量必须用final修饰:hello
匿名内部类HmanDao
匿名内部类Hman
3匿名内部类
A:是局部内部类的简化形式
B:前提:存在一个类或者接口
C:格式:
new 类名或者接口名() {
重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类好处
随着方法的介绍而结束; new 类名或者接口名() { 重写方法; } 本身就是使用完就结束