内部类定义
把一个类放到另一个的定义称为内部类
内部类的作用
*内部类提供了更好的封装,只能由外部类直接访问,不能由同一个包中的其他类访问
*内部类可以直接访问外部类的私有属性,内部类被当成外部类的成员。
*外部类不能访问内部类的内部属性
内部类的使用场景
由于内部类使用了更好的封装性,并且可以很方便的访问到外部类的属性,所以通常情况下内部类只在为为外部类提供服务的情况下优先使用
内部类的分类
*成员内部类(可以使用public、procted、private进行修饰)
- 成员内部类中不能存在任何static变量和方法
- 成员内部类依附于外部类,只有先创建了外部类才能创建内部类
*方法内部类
- 方法内部类定义在外部类的方法中,局部内部类和成员内部类基本一致,只是它们的作用域不同,方法内部类只能在该方法中被使用,出了该方法就会失效。
*匿名内部类 (匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束)
- 匿名内部类是没有访问修饰符的。
- 匿名内部类必须继承一个抽象类或者实现一个接口
- 匿名内部类中不能存在任何静态成员或方法
- 匿名内部类是没有构造方法的,因为它没有类名。
#匿名内部代码实例:
public class Button {
public void click(){
//匿名内部类,实现的是ActionListener接口
new ActionListener(){
public void onAction(){
System.out.println("click action...");
}
}.onAction();
}
//匿名内部类必须继承或实现一个已有的接口
public interface ActionListener{
public void onAction();
}
public static void main(String[] args) {
Button button=new Button();
button.click();
}
}
*静态内部类(关键字static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静态内部类)
- 静态内部类的创建是不需要依赖于外围类,可以直接创建
- 静态内部类不可以使用任何外围类的非static成员变量和方法,而内部类则都可以
#静态内部类代码实例:
public class OuterClass {
private static String outerName;
public int age;
static class InnerClass1{
/* 在静态内部类中可以存在静态成员 */
public static String _innerName = "static variable";
public void display(){
/*
* 静态内部类只能访问外部类的静态成员变量和方法
* 不能访问外部类的非静态成员变量和方法
*/
System.out.println("OutClass name :" + outerName);
}
}
class InnerClass2{
/* 非静态内部类中不能存在静态成员 */
public String _innerName = "no static variable";
/* 非静态内部类中可以调用外部类的任何成员,不管是静态的还是非静态的 */
public void display(){
System.out.println("OuterClass name:" + outerName);
System.out.println("OuterClass age:" + age);
}
}
public void display(){
/* 外部类能直接访问静态内部类静态元素 */
System.out.println(InnerClass1._innerName);
/* 静态内部类可以直接创建实例不需要依赖于外部类 */
new InnerClass1().display();
/* 非静态内部的创建需要依赖于外部类 */
OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();
/* 非静态内部类的成员需要使用非静态内部类的实例访问 */
System.out.println(inner2._innerName);
inner2.display();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.display();
}
}