内部类
一:分类
成员内部类:普通成员内部类,私有成员内部类,静态成员内部类
局部内部类
匿名内部类
二:普通成员内部类
可以被哪些修饰:private(私有成员内部类),default,protected,public
普通成员内部类
a.可以访问外部类的所有成员,包括私有的
b.外部类访问内部类成员需要先创建内部类对象
c.不能有静态资源
public class InnerClassTest { private int a=10; public void test(){ System.out.println("外部类test"); InnerClass innerClass=new InnerClass(); } class InnerClass{ private int a=20; public void test1(){ test(); System.out.println(a); InnerClassTest innerClassTest=new InnerClassTest(); innerClassTest.test(); System.out.println("内部类test"); } } } class Test{ public static void main(String[] args) { InnerClassTest.InnerClass innerClass=new InnerClassTest().new InnerClass(); System.out.println(innerClass); innerClass.test1(); } }
私有成员内部类
a.若要访问只能提供一个公共的方法访问
public class PrivateClass { private int a=10; private void test(){ System.out.println("outer class"); } private class PrivateInnerClass{ private int b=20; private void test1(){ System.out.println("inner class"); } } public void getPrivateInnerClass(){ PrivateInnerClass privateInnerClass = new PrivateInnerClass(); System.out.println(privateInnerClass.b); } } class Test{ public static void main(String[] args) { PrivateClass privateClass=new PrivateClass(); privateClass.getPrivateInnerClass(); } }
静态成员内部类
a.直接使用类名调用
public class StaticClassTest { public static void main(String[] args) { StaticClassTest.StaticInnerClass.print(); } static class StaticInnerClass{ public static void print(){ System.out.println(123); } } }
局部内部类
a.只能在方法体内实例化类
b.可以直接访问该类的私有属性,都属于该方法
public class JuBuClassTest { public static void main(String[] args) { test(); } public static void test(){ class JuBu{ private int a=10; private void print(){ System.out.println(a); } } JuBu juBu=new JuBu(); juBu.print(); System.out.println(juBu.a); } }
匿名内部类
在多线程种使用较多
public class NoNameClass { public static void main(String[] args) {
//相当于创建子类对象并调用方法 new Cat(){}.eat(); } } class Animal{ void eat(){ System.out.println("吃"); } } class Cat extends Animal{ @Override void eat() { System.out.println("猫吃鱼"); } }