将一个类定义在另一个类里面,就是内部类。
普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。
定义在方法和作用域内的内部类,局部内部类。
局部内部类不能访问说明符,因为它不是外围类的一部分,但它可以访问当前代码块内的常量。以及此外围类的所有成员。
将内部类声明为static,被称为嵌套类。
要创建嵌套类的对象,不需要其外围类的对象。
不能从嵌套类的对象中访问非静态的外围类对象。
普通内部类的字段和方法不能使用static,也不能包含嵌套类;字段可以使用static final
嵌套类可以包含这些。
class 文件
每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息。class对象。
内部类 : 外围类名$内部类名
匿名类: 数字代替$ 第一个局部匿名类1 外围类名1内部类名 第二个 外围类名2内部类名
基本的内部类。
public class InnerBasic {
private int id;
protected String name;
static int age;
abstract class Inner {
public String inner;
void test() {
this.inner = name;
}
}
private class PInner {
}
final class Inners {
String iname = name;
int id = new InnerBasic().id;
InnerBasic getOut() {
return InnerBasic.this; // 返回对外部类对象的引用
}
}
static class Innert {
int idt = age;
String s = new InnerBasic().name;
Object test() {
class Testt {
void xxx() {
System.out.println("xxx");
}
}
return new Testt();
}
}
public static void test1() {
Innert inner = new Innert(); // static
Inners inners = new InnerBasic().new Inners();
}
public void test() {
Innert innert = new Innert(); // static
InnerBasic.Inners inner = new InnerBasic.Inners();
}
}
局部内部类
package com.javase.innerclass;
public class MethodInnerClass {
public IService getService (final String s) {
final int count = 100; // 可以使用count 不能修改,final/这里看起来像闭包, 但是完全不同。 这个方法结束,count作用域结束.
final Person person = new Person();
class InnerService implements IService {
String name;
InnerService(String name) {
this.name = name;
}
@Override
public void test() {
this.name = s;
System.out.println("method inner test" + count + name +person.province);
}
}
return new InnerService(s);
}
}
匿名内部类// 对于匿名类而言,实例初始化的实际效果就是构造器,。不能重载实例初始化方法,所以只能有一个构造器。
匿名内部类与正规的继承相比有些受限,因为匿名内部类可以扩展类, 也可以实现接口,但不能两者兼备。
public class AnonymityClass {
public void print() {
System.out.println("print");
}
IService test() {
new AnonymityClass() {
}.print();
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return (o1.id > o2.id ? 1 : -1);
}
};
List<Person> list = new ArrayList<Person>();
Collections.sort(list, comparator);
return new IService() {
@Override
public void test() {
}
};
}
}