Java基础7:内部类
一、什么是内部类
内部类:就是在一个类内部进行其他类结构的嵌套操作。
二、内部类的分类
在Java中内部类主要分为成员内部类类、方法内部类、匿名内部类、静态内部。
(1)成员内部类
public class Out { private String name; public void showName(){ System.out.println("my name is : "+name); } public class In{ public void sayHello(){ System.out.println(name); Out.this.showName(); } } }
我们的成员内部类可以直接访问外部类的成员字段和成员方法,因为它是关联着一个外部类实例的。
(2)方法内部类
1、局部内类不允许使用访问权限修饰符 public private protected 均不允许
2、局部内部类对外完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的
3、局部内部类与成员内部类不同之处是他可以引用成员变量,但该成员必须声明为 final,并内部不允许修改该变量的值。
public class Out { private String name; public void sayHello(){ class In{ public void showName(){ System.out.println("my name is : "+name); } } In in = new In(); in.showName(); } }
方法内部类的生命周期不超过包含它的方法的生命周期,也就是说,方法内部类只能在方法中使用。所以在声明的时候,任何的访问修饰符都是没有意义的,于是Java干脆不允许使用任何的访问修饰符修饰方法内部类。
(3)匿名内部类
1、匿名内部类是没有访问修饰符的。
2、匿名内部类必须继承一个抽象类或者实现一个接口
3、匿名内部类中不能存在任何静态成员或方法
4、匿名内部类没有明面上的构造方法,编译器会自动生成一个引用外部类的构造方法。
5、与局部内部相同匿名内部类也可以引用局部变量。此变量也必须声明为 final。
//首先定义一个普通类 public class Out { private String name; private void sayHello(){ System.out.println("my name is :" + name); } } //定义和使用一个匿名内部类 public static void main(String [] args){ Out out = new Out(){ @Override public void sayHello(){ System.out.println("my name is cyy"); } public void showName(){ System.out.println("hello single"); } }; out.sayHello(); }
(4)静态内部类
1、静态内部类可以有静态成员
2、静态内部类可以访问外部类的静态变量,而不可访问外部类的非静态变量;
3、静态内部类的创建不依赖于外部
public class Out { private static String name; private int age; public static class In{ private int age; public void sayHello(){ System.out.println("my name is : "+name); //--编译报错--- //System.out.println("my age is :"+ age); } } }
三、内部类的创建
(1) 在外部类外部 创建非静态内部类
语法: 外部类.内部类 内部类对象 = new 外部类().new 内部类();
举例: Outer.Inner in = new Outer().new Inner();
(2)在外部类外部 创建静态内部类
语法: 外部类.内部类 内部类对象 = new 外部类.内部类();
举例: Outer.Inner in = new Outer.Inner();
(3)在外部类内部创建内部类语法
在外部类内部创建内部类,就像普通对象一样直接创建:Inner in = new Inner();