1.成员内部类----成员方法
*******成员内部类不能存在任何static变量或方法,可以访问外部类的静态变量
成员内部类需要依附外部类new outter().new inner();
内部类可以使用private封装,表示私有内部类,该内部类只供外部类使用.
2.静态内部类----静态方法
a.静态内部类的创建不需要外部类,可以直接创建。
b.静态内部类不可以访问外部类的任何非static变量
******不能访问非静态变量,可以存在自己的成员变量。
static定义一个静态内部类
class Outer{ //外部类
private static String msg="hello world";
static class Inner{ //定义一个静态内部类
public void print(){
System.out.println(msg);
}
}
public void fun(){//在外部类中定义一个方法,该方法负责产生内部类对象并调用print方法
Inner in=new Inner();
in.print();
}
}
public class hehe{
public static void main(String[]args){
Outer out=new Outer();//外部类对象
out.fun();//外部类方法
}
}
3.方法内部类---成员内部类(没有静态变量)
1. 局部内类不允许使用访问权限修饰符 public private protected 均不允许。
2. 局部内部类对外(方法外)完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的。
3. 局部内部类要想使用方法形参,该形参必须用final声明(JDK8形参变为隐式final声明).
class Outter {
private int num;
public void display(final int test) {//test最终变量
class Inner { //不能加任何修饰
private void fun() {
num++;
System.out.println(num);
System.out.println(test);
}
}
new Inner().fun();
}
}
public class mytest {
public static void main(String[] args) {
Outter out = new Outter();
out.display(20);
}
}
4.匿名内部类
是方法内部类的特殊版本
1. 匿名内部类是没有访问修饰符的。
2. 匿名内部类必须继承一个抽象类或者实现一个接口
3. 匿名内部类中不能存在任何静态成员或方法
4. 匿名内部类是没有构造方法的,因为它没有类名。
5. 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final.
interface MyInterface {
void test();
}
class Outter {
private int num;
public void display(int para) {
// 匿名内部类,实现了MyInterface接口
new MyInterface(){
public void test() {
System.out.println("匿名内部类"+para);
}
}.test();
}
}
public class mytest{
public static void main(String[] args) {
Outter outter = new Outter();
outter.display(20);
}
}
内部类的特点:
1. 破坏了程序的结构
2. 方便进行私有属性的访问。(外部类也可以访问内部类的私有域)
3. 如果发现类名称上出现了".",应当立即想到内部类的概念。