一 概念
内部类,顾名思义,就是一个类的内部有其他的类,比如下面这种,一个最简单的内部类示例,内部类又分为 静态内部类和非静态内部类,非静态内部类又分为 1.普通内部类(也称为成员内部类) 在一个类(外部类中直接定义的内部类),这个外部类是相对于内部类来说的,2. 匿名内部类 3.方法内部类(在一个方法,外部类的方法)或代码块中定义的内部类。
内部类仍是一个独立的类,在编译后内部类会被编译成独立的class文件,但是前面冠以外部类的类名和$符号。
内部类可以使用修饰符(private ,public ,protected,default)(方法内部类除外)
public class TestClass { // 普通内部类 class testone { } // 静态内部类 class statictest { } public void getTest() { // 方法内部类 class methodTest { } } // 匿名内部类 Runnable run = new Runnable() { // 并不是new接口,而是定义了一个内部类的类体, // 同时继承runnable接口 ,new出来了一个实例对象,new对象的动作和定义内骨类的动作放在了一起 @Override public void run() { // TODO Auto-generated method stub } }; }
静态内部类基本用法
静态内部类 1.可以包含静态,非静态成员 ,2.可以直接调用外部类的静态属性和方法,但是普通属性和方法不能调用不能调用,因为无法从一个静态类中发出对非静态类的请求。3. 在不相关类中 可以直接创建静态内部类的对象(需要通过所在外部类)4. 静态内部类实际上和外部类联系很少,也就是命名空间上的关系。
public class Test { public static void main(String[] args) { MyClass.Statictest st = new MyClass.Statictest();// 通过外部类new出静态内部类的实例对象 st.printStatictest(); } } class MyClass { static String str = "静态内部类测试"; int d = 20; static class Statictest { void printStatictest() { // System.out.println(d); 无法调用普通成员变量 System.out.println(str);// 调用静态变量 } } }
普通内部类(成员内部类)
1 成员内部类就像一个成员变量一样存在于外部类中 ,静态内部类也像一个静态成员变量一样存在于外部类中
2 成员内部类可以访问内部类的所有成员(包括 private ) 静态内部类只能访问 外部类的静态成员
3 成员内部类的this是指内部类本身,要拿到外部类可以使用 外部类名+this 成员内部类的对象一定要绑在一个外部类对象上,因此,创建内部类对象需要有持有外部类兑现的引用,因此,要先有外部类对象,才能有内部类对象。
public class Test { public static void main(String[] args) { MyClass m = new MyClass();// 要访问内部类对象,需要先new出外部类,因为内部类需要外部类的引用 MyClass.test mt = m.new test(); mt.printlnd(); } } class MyClass {// 内部类就是为了服务外部类,如果服务于多了类,就会将其设置成一个公共类 static String str = "静态内部类测试"; int d = 20; void printstr() { System.out.println(str); test t = new test(); System.out.println(t); } class test { void printlnd() { printstr();// 调用外部类方法 System.out.println(str);// 访问外部类的静态和非静态成员 System.out.println(d); } } }
方法内部类
public class TestClass { int a = 10; public void printlnt() { int b = 50; final int c = 45; class metodnClass { // int a=b;//内部类不可访问所在方法局部变量,除非该变量设为final // 原因 :方法内部类和局部变量声明周期不一致 int e = c; // static int p=10;//方法内部类只能包含非静态成员 void printlp() { System.out.println(e); } } metodnClass mc = new metodnClass();// 方法内部类只能在方法内部可见 mc.printlp(); } // metodnClass mc=new metodnClass();//方法内部类只能在方法内部可见,放在方法外部不可行 }
匿名内部类
如果匿名内部类定义在方法体内部,那么它既是方法内部类也是匿名内部类,匿名内部类只能使用一次,因为没有类名,无法调用。
`
package compiler; public class Ntest { public static void main(String[] args) { nitest n=new nitest(); n.printcar(); } } class nitest{ void test01(car c){ c.printcar(); } void runtest(){ //接口方式,接口是不能被new的这是new了一个匿名内部类并实现了Runnable接口 Runnable run=new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("接口式"); } }; } void printcar(){ //继承式内部类 car c=new car(){ @Override void printcar() { // TODO Auto-generated method stub System.out.println("继承式,打印子类的骑车,重写了父类的printcar方法"); } }; c.printcar(); } void printtest01(){ //参数式匿名内部类 因为参数是car对象, 直接new一个car继承并重写printcar()方法 //和继承式匿名内部类比较相似 test01(new car(){ @Override void printcar() { // TODO Auto-generated method stub System.out.println("参数式匿名内部类"); } }); } } class car{ void printcar(){ System.out.println("打印汽车"); } }