内部类:定义在类内部的类
1.成员内部类(非静态内部类)
public class A {
class B {
public static void main(String[] args) {
System.out.println("hello world");
}
}
}
B是A的成员内部类,新建一个测试类Test.class,在测试类中直接new这个B类是New不出来的

正确的new方法,要使用B类,应该先创建类对象:
public class Test {
static void main() {
A a = new A();
A.B b = a.new B();
}
}
或者还可以这样new出B类:
public class Test {
static void main() {
A a = new A();
A.B b = new A().new B();
}
}
Tips:private是可以修饰类的,但是只有当B类是A类的成员内部类的时候,才能给B类加private修饰符
成员内部类有一个别的语言都没有的优点:持有一个指向其外部类的引用
也就是说,这个类是可以访问他的外部类的
package cn.tinsur.lianxi.st8;
public class A {
private static String name;
public void setName(String name){
this.name = name;
}
private void sayHello(){
IO.println("im + "+ name);
}
public class B {
public static void main(String[] args) {
System.out.println( name + "im b");
}
}
static void main() {
System.out.println("hello world");
}
}

成员内部类简介实现继承
Java不支持直接通过extends实现多重继承,但是可以通过一些技巧实现多重继承

2.静态内部类
public class A {
public static int age;
public static void study(){
IO.println(age);
}
//静态成员,静态内部类
public static class B{
}
}
静态内部类可以引用其外部类的静态成员
例如:

如果去掉外部类中age属性的static修饰符,则无法在内部类中访问

静态内部类无需先创建其外部类的实例:
public class Test {
static void main() {
A.B b = new A.B();
}
}
3.匿名内部类
没有名称的内部类,使用频率较高。
因为没有名字,所以只能在定义的地方唯一的创建一次,匿名内部类继承自父类,匿名内部类同时包含Java的三个特性:封装、继承、多态。
public class Test {
//匿名内部类,只能在定义的地方唯一的创建一次
Person p1 = new Person(){
private int age;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public void study(){
IO.println( getName() + "正在学习");
}
};
}
匿名内部类一般不会定义自己的方法,只会重写父类的方法,因为定义自己的方法的话一般情况下无法调用(可以使用反射特性强制实现)
4.局部内部类
public class A {
public void func() {
Random r = new Random();
int i = r.nextInt();
if (i < 100) {
class Point {
public int x;
public int y;
}
IO.println("aaa");
}else {
IO.println("bbb");
}
}
static void main() {
A a= new A();
a.func();
}
}
THE END
