1.普通内部类
即类在外部类内部,需要创建外部类后才能使用,因为内部类隶属于外部类,其就像类中的属性和方法一样,必须创建后才能使用。创建内部类的语法是:
外部类对象.new 内部类名();如下所示
new OuterClass().new InnerClass1().name();
2.静态内部类
静态内部类顾名思义类加了static关键词,静态内部类和普通内部类有许多特性:
a:首先就是调用方式不同,不再需要通过外部类对象.new 内部类名()的方式创建,只需要直接创建即可,很好理解,因为它是静态的,也就是通过外部类名.内部类名()的方式创建,(或许你会问怎么看别人用直接创建即可,这相当于一个语法糖,但是如果你加了外部类名那就会让代码更加清晰)。
// 静态内部类可直接创建,也可以通过外部类名.内部类名()的方法创建,两种方式皆可
new OuterClass.innerClass2().name();
new innerClass2().name();
b:静态内部类是无法向普通内部类一样可以直接调用外部类的对象和方法的,其必须通过创建外部类的对象的方式来调用,当然,外部类的静态方法和属性可以直接调用
static class innerClass2{
public void name(){
// System.out.println("我是静态内部类"+age);
// 以上是不被允许的,静态内部类不允许访问外部类的属性和方法,包括私有的
// System.out.println(name);
System.out.println(gender);
}
}
3.局部内部类
a:定义在类的局部,局部在哪?在方法或是代码块中。一般在方法体里将写类时,也直接在方法体中将类创建,因为方法体的外部是无法将局部内部类创建对象的。且调用类里面的方法
b:局部内部类可以像普通方法一样访问外部的属性
public void innerName(){
class LocalInnerClass{
public void name(){
System.out.println(name);
}
}
new LocalInnerClass().name();
}
4.匿名内部类
匿名内部类即是没有名字的类,同时定义和实例化对象同时完成,一般与接口一起使用,接口是不能像类一样调用对象的,所以一般只能够通过接口实现类的方式来使用,而匿名内部类就给我们提供了一种调用接口的方式,其直接在匿名内部类内部将接口中的方法进行重写。
AnonymousInnerclass anonymousInnerclass = new AnonymousInnerclass() {
@Override
public void name() {
System.out.println("匿名内部类一般只调用一次");
}
};
anonymousInnerclass.name();
interface AnonymousInnerclass{
void name();
}
以下是内部类的所有代码
public class OuterClass {
int age = 19;
private String name="花花";
static String gender="男";
public void name(){
System.out.println("我是外部类");
}
//局部内部类
public void innerName(){
class LocalInnerClass{
public void name(){
System.out.println(name);
}
}
new LocalInnerClass().name();
}
class InnerClass1{
public void name(){
System.out.println("我是内部类"+age);
System.out.println("通过创建外部类的方式调用外部类"+"---------------"+new OuterClass().name);
}
}
//静态内部类
static class InnerClass2{
public void name(){
// System.out.println("我是静态内部类"+age);
// 以上是不被允许的,静态内部类不允许访问外部类的属性和方法,包括私有的
// System.out.println(name);
System.out.println(gender);
}
}
public static void main(String[] args) {
new OuterClass().name();
//1.直接创建内部类对象是不被允许的,必须要有外部类
// new innerClass1().name();
new OuterClass().new InnerClass1().name();
//2.静态内部类不能通过创建外部类对象的方式调用
// new innerClass().new innerClass2().name();
// 静态内部类可直接创建,也可以通过外部类名.内部类名()的方法创建,两种方式皆可
new OuterClass.InnerClass2().name();
new InnerClass2().name();
//3.局部内部类,局部内部类可以向普通方法一样访问外部的属性
new OuterClass().innerName();
//4.匿名内部类
AnonymousInnerclass anonymousInnerclass = new AnonymousInnerclass() {
@Override
public void name() {
System.out.println("匿名内部类一般只调用一次");
}
};
anonymousInnerclass.name();
}
}
interface AnonymousInnerclass{
void name();
}