什么是内部类
内部类(inner class)是定义在一个类中的类。所以为什么需要内部类呢?
主要是由两个原因:
- 内部类可以对同一个包中的其他类隐藏。
- 内部类方法可以访问定义这些方法的作用域中的数据,包括原本私有的数据。
所以内部类可以理解为一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。
类的"五"大成员是哪些?---->[属性、方法、构造器、代码块、“内部类”]
内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
其中区别为----->如果定义类在局部位置(方法中/代码块) :(1) 局部内部类 (2) 匿名内部类
-------->定义在成员位置 (1) 成员内部类 (2)静态内部类
成员内部类
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);
**外部类访问非静态成员内部类的成员,必须要创建成员内部类对象;**外部类可以通过类名直接访问静态内部类的静态成员,包括私有的。
成员内部类和外部类不存在继承关系
成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内部类的时候必须先实例化外部类对象
外部类名.内部类名 对象名 = new 外部类().new 内部类();
实例
public class Test {
String words = "Helloworld!";
public class inner{
String str = "我来了";
public void show(){
System.out.println(words+str);
}
}
public static void main(String[] args){
Test.inner t = new Test().new inner();
t.show();
}
}
局部内部类
声明局部类时不能有访问说明符(即 public 或 private )。局部类的作用域总是限定在声明这个局部类是块中。
局部类具有一个很大的优势 ,即对外部世界完全隐藏。就算是继承某父类(或实现某接口),若局部内部类中没调用的方法,父类或父接口都无法访问它。
相比于其他内部类,局部类还有一个优点,它们不仅能够直接访问方法外部类中属性和方法(包含私有的),还可以访问局部变量(不过,这些局部变量必须是事实最终变量 effectively final)
实例:
public class Test {
String words = "Helloworld!";
private int A = 123;
final String mark = "我来了";
public void Way(){
class inner{
String a = words;
int b = A;
String c = mark;
}
inner w = new inner();
System.out.println(w.a+w.b+w.c);
}
public static void main(String[] args){
Test t= new Test();
t.Way();
}
}
匿名内部类
使用局部类时,通常可以再进一步,如只想创建一个对象,甚至不需要为类指定名字。这样的一个类通常被称为匿名内部类(anonymous inner class).
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
匿名内部类可以直接访问外部类的所有成员,包含私有的,但不能添加访问修饰符,因为它的地位就是一个局部变量,它作用域:仅仅在定义它的方法或代码块中。
实例
public interface Words {
public void fun();
}
public class Test {
public static void main(String [] args){
Words w = new Words(){
@Override
public void fun(){
System.out.println("Helloworld!");
}
};
w.fun();
}}
静态内部类
为把一个类隐藏在另一个类的内部,并不需要内部类有外部类对象的引用。为此,可以将内部类声明为static,这样就不会生成那个引用了。
只要内部类不需要访问外部类对象,就应该使用静态内部类。有些程序员会用镶嵌类(nested class)表示静态内部类
与常规内部类不同,静态内部类可以有静态方法和属性,可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员
在接口中声明的内部类自动是static 和 public
实例
public class Test {
static String words = "Helloworld!";
int num = 100;
static class inner{
String a = "我来了";
public void show() {
System.out.println(Test.words + a);
}
}
public static void main(String[] args){
inner i = new inner();
i.show();
}
}