1、什么是内部类:就是在一个类的内部声明类。如:
class Outer { class inner{ } }
关于如何访问内部类:
class Outer { private int a = 1024; class Inner { public int b = 512; public void test1(){ System.out.println(a);//可以访问私有变量 } } public void test2(){ System.out.println(new Inner().b); } } public class Demo01 { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.test1(); } }
从上面的例子可以看出内部类的声明方式: 外部类名.内部类名 对象名=new 外部类名().new 内部类名()。
另外:内部类可以访问外部类的成员变量,即使它是外部类所私有的。而外部类想要访问内部类的变量则必须创建该内部类对象才能访问。
2、上面的是一般的外部类,现在介绍私有内部类,即用private修饰的内部类。
public class Demo01 { public static void main(String[] args) { //私有内部类 //无法使用Outer.Inner //私有内部类方法如何调用? //通过在外部内创建私有内部类对象来调用方法 Outer outer = new Outer(); outer.test3(); } } class Outer { private int a = 1024; //私有内部类 private class Inner { public int b = 512; public void test1(){ System.out.println(a);//可以访问私有变量 } } public void test2(){ System.out.println(new Inner().b); } public void test3(){ new Inner().test1(); } }
由上可以看出,在外部类的外面是无法访问私有内部类的方法的,只能在外部类中创建内部类的对象,然后访问该方法。
3、静态内部类。用static修饰的内部类。
public class Demo { public static void main(String[] args) { //创建静态内部类对象 语法: Outer.Inner inner = new Outer.Inner(); inner.test1(); Outer.Inner.test2();//调用静态方法 } } class Outer { private static int a = 1024; static class Inner { public int b = 512; public void test1(){ System.out.println(a);//可以访问私有变量 } public static void test2(){ System.out.println("test2"); } } }
可以看出如果想要调用静态内部类的方法,不需要创建内部类的对象,只要:外部类名.内部类名.静态方法();即可。但是静态内部类如果想访问外部内成员变量,该成员变量需要用static修饰。
4、关于类名.this。
class Animal { public void test(){ System.out.println(Animal.this); } } public class Demo01 { public static void main(String[] args) { Animal a = new Animal(); a.test(); System.out.println(a); } }
结果:
lesson04.Animal@7852e922
lesson04.Animal@7852e922
这说明类名.this其实和this是一样,都是一个该类的对象。如下:
public class Demo01 { public static void main(String[] args) { Outer.Inner inner = new Outer().new Inner(); inner.show();// 10,20,30 } } class Outer { public int num = 30; class Inner { public int num = 20; public void show(){ int num = 10; System.out.println(num); System.out.println(this.num); System.out.println(Outer.this.num); } } }
5、局部内部类。即在方法中定义的内部类。
public class Demo01 { public static void main(String[] args) { Outer outer = new Outer(); outer.test1(); } } class Outer { public void test1(){ // int a = 10;//jdk1.8没问题,以下版本要加上final class Inner { public void test2(){ //Local variable a defined in an enclosing scope must be final or effectively final //a = 11; a是被final修饰的 System.out.println(a); } } Inner inner = new Inner(); inner.test2(); } }
如上所示,局部内部类其实和定义在类中的内部类差不多。只是在访问方法中的局部变量时,实际上该变量是final类型的,不可以再次改变其值。在JDK1.8及其以后可以不用显示的声明final。
6、匿名内部类。匿名内部类存在的前提是存在一个抽象类或接口。匿名内部类必须实现所有的抽象方法。匿名内部类实际是抽象类或接口的一个子类对象或实现类对象。
public class Demo01 { public static void main(String[] args) { //匿名内部类 //前提是存在一个抽象类或者接口 //匿名内部类必须是实现抽象类或者接口的所有方法 //匿名内部类实际是一个匿名对象 //第一种使用方式 Animal animal = new Animal(){ @Override public void eat() { // TODO Auto-generated method stub System.out.println("吃东西..."); } @Override public void run() { // TODO Auto-generated method stub System.out.println("4条腿跑..."); } }; animal.eat(); //第二种方式 new Animal(){ @Override public void eat() { // TODO Auto-generated method stub } @Override public void run() { // TODO Auto-generated method stub } }.eat(); } } abstract class Animal { public abstract void eat(); public abstract void run(); }
如有错误,请各位大神不吝指出。万分感谢!