在Java中允许一个类定义在另一个类的内部,前者称为内部类,后者称为外部类。内部类和外层封装它的类之间存在逻辑上的所属关系。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class的名字不能与包含它的类名相同;
Inner class可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量;
内部类
- 内部类分为四种:成员内部类,静态内部类,局部内部类,匿名内部类
1)成员内部类
1、 成员内部类:指在外部类里直接定义的没有用static修饰的类
2、 内部类的属性和类里面定义的方法一样,可以调用外部类任意修饰符修饰的属性,而外部类只能调用内部类里面使用static修饰的属性。
public class Increment {//外部类的定义
private String name = "wangwu";
public int age = 20;
static String address = "北京市";
public class Information{//内部类的定义
String sex = "男";
int age = 100;
//Information inf = new Information();
public void show(){
System.out.println("姓名为:"+name+"性别为:"+sex);
System.out.println("年龄为:"+age+"地址为:"+address);
}
}
public void show1(){
System.out.println("姓名为:"+name+"性别为:");
System.out.println("年龄为:"+age+"地址为:"+address);
}
}
public class Test {
public static void main(String[] args) {
Increment in = new Increment();
in.show1();
Increment.Information inf = in.new Information();//外部类的实例化
inf.show();
}
}
结果图
2)静态内部类
1、静态内部类:顾名思义就是在常规内部类的前面加上修饰词Static。
2、静态内部类与静态方法相似。都是不能直接访问外部类中的变量。只能够直接访问外部类中的静态变量。但是我们可以通过在内部类里面实例化外部类的对象进行调用。
3、由于静态内部类不能对外部类中的非静态属性方法进行访问,所以不能够使用this关键字
public class Quiet {
private static String name = "大圆子";
public int age = 3;
public String address = "北京市";
static class Information{
public int age = 4;
public String sex = "母猫";
public void show(){
//年龄是静态的所以可以直接调用
System.out.println("姓名:"+name+"年龄:"+age);
//注意这里不能通过this等方式调用,只能通过对象调用
//再外部类中调用内部类成员变量也需要实例化对象在调用
Quiet q = new Quiet();
System.out.println("性别:"+sex+"地址:"+q.address);
}
}
public void show1(){
System.out.println("姓名:"+name+"年龄:"+age);
System.out.println("性别:"+" "+"地址:"+address);
}
}
public class Test {
public static void main(String[] args) {
Quiet qu = new Quiet();
qu.show1();
System.out.println("~~~~~~~~");
//静态内部类的可以使用调用方法
Quiet.Information in =new Quiet.Information();
in.show();
}
结果图
3)方法内部类
1、方法内部类定义在方法内部且只能在该方法内使用。
2、由于1所以方法内部类不能被static修饰,也不能被访问修饰符修饰
public class MethodInner {
private String name = "土豆";
public int age = 5;
public void show(){
String address = "北京市";
class Information{
private String sex = "公猫";
}
Information in = new Information();
System.out.println("姓名:"+name+"年龄:"+age);
System.out.println("性别:"+in.sex+"地址:"+address);
}
}
public class Test {
public static void main(String[] args) {
MethodInner mt = new MethodInner();
mt.show();
}
}
结果图
4) 匿名内部类
匿名内部类就是没有名字的内部类,究竟什么情况下需要使用匿名内部类呢?
如果满足下面的一些条件,建议使用匿名内部类
□只用到类的一个实例
□类在定义后立即用到
□类非常小(Sun推荐是在4行代码以下)
□给类命名并不会导致你的代码更容易被理解
在使用匿名内部类时需要遵循如下原则
□匿名内部类不能有构造方法
□匿名内部类不能定义任何静态成员、方法和类
□匿名内部类不能是public、protected、private和static
□只能创建匿名内部类的一个实例
□一个匿名内部类一定是在new的后面、用其隐含实现一个接口或实现一个类。
□因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效
interface Inter1{
public void m();
}
class Test{
public static void main(String[] args){
Inter1 i = new Inter1(){
//重写抽象方法
public void m(){
System.out.println("aaa");
}
};
i.m();
}
}