这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
外部类
一般我们说的类都是指外部类(如那种定义的.java文件的类) 如
public class TeacherClazzVo {
private long id;
private String clazzName;
}
内部类
Java允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。没有用 static来声明的嵌套类,就称为非静态嵌套类,非静态嵌套类又称为内部类。 主要包含三种类型 成员内部类、局部内部类和匿名内部类
- 成员内部类 在一个类中定义的类,作为外部类的一个成员,与外部类的属性,方法级别是一样的,它可以访问外部类的私有成员和属性。但是外部类想要访问内部类的成员则需要建立内部类对象去访问。
注意:内部类和外部类之间有同名成员时,内部类可以以外部类名.this.变量名 访问外部类成员;在成员内部类不能存在static 关键字(不能有静态方法,静态属性,静态代码块等)
-
局部内部类 从名字就可可指,这种类是一种局部的,和局部变量有些相似,一般局部内部类是定义在一个方法中定义的内部类,不能使用private,protected,public修饰符,也不能存在static 关键字
-
匿名内部类 匿名类能够使代码更加简洁,它们能够同时声明和实例化一个类。它们就像本地类,只是它们没有名称(本地类是类声明,而匿名类是表达式)
public class Test {
interface Hello{
public void greet();
public void greetToPeople(String name);
}
public void sayHello(){
//局部内部类
class EnglishGreeting implements Hello{
String name = "wzy1";
@Override
public void greet() {greetToPeople(name); }
@Override
public void greetToPeople(String name) {System.out.println("Hello "+name); }
}
Hello hello1 = new EnglishGreeting();
//匿名内部类
Hello hello2 = new Hello() {
String name = "wzy2";
@Override
public void greet() {greetToPeople(name);}
@Override
public void greetToPeople(String name) { System.out.println("Hello "+name);}
};
hello1.greet();
hello2.greet();
}
public static void main(String[] args) {
Test test = new Test();
test.sayHello();
}
}
运行结果:
上面代码中使用了两种类型的内部类:一种是局部内部类EnglishGreeting,一种是匿名内部类hello2,局部内部类有自己的类名,使用时需要实例化,而匿名内部类是一个表达式,直接就可以new一个表达式。匿名内部类和局部内部类都可以访问外部类的所以成员
匿名内部类是没有类名字的内部类,是一个表达式,因此只能使用一次,但是要使用匿名内部类必须要继承或实现一个接口才能使用。
静态内部类
上面三种类型的内部类和静态内部类之间有什么区别呢?内部类是以外部类为前提的,没有外部类就无法谈内部类;静态内部类可以自己完全独立存在,但是他可以以外部类作为依托。
使用static修饰的内部类就是一个静态内部类。
public class Test {
private String name1 = "wzy1";
private static String name2 = "wzy2";
public void testage(){
System.out.println(new InnerClass().age1);
System.out.println(InnerClass.age2);
}
static class InnerClass{
private int age1= 18;
private static int age2 = 20;
public void hello(){
System.out.println("Hello "+name2);
}
}
public static void main(String[] args) {
Test test = new Test();
test.testage();
InnerClass in = new InnerClass();
in.hello();
}
}
静态内部类InnerClass 只能访问外部类的类成员 不能访问实例成员(如访问name1就问报错) 外部类可以使用静态内部类:类名.来访问类成员或者也可以使用对象的方式来访问。