谈起内部类,我相信大家很多人都对他并不陌生,但又有很多人并不习惯的去用它,应该也就渐渐把他忘却,今天我就详细讲解关于java中的内部类的概念,以及怎样去用内部类。
一.内部类
1.什么是java中的内部类
内部类(Inne Class)就是定义在一个类里面的类.
2.使用内部类的作用
01.内部类提供了更好的封装,可以把内部类隐藏在外部类(包含内部类的类被称为外部类)之内,不允许同一个类中的其他类来访问该类。
02.内部类的方法可以直接访问外部类的所有数据,也能访问外部类的私有字段。
3.内部类的有几种
成员内部类
静态内部类
方法内部类
匿名内部类
二.如何使用内部类
//外部类Happy public class Happy { //内部类Lucky public class Lucky { //内部类的say方法 public void say() { System.out.println("我是内部类"); } } //mian方法 public static void main(String[] args) { //实例化外部类 Happy happy=new Happy(); //实例化内部类 Lucky lucky=happy.new Lucky(); //调用内部类的sayfangf lucky.say(); }
输出结果:我是内部类
三.Java中的成员内部类
//外部类Test public class Test { private int a=10;//外部类的私有属性 //内部类happy public class Happy { int b=20;//内部类的成员属性 public void test() { System.out.println("外部类的a:"+a); System.out.println("内部类的b:"+b); } } //main方法 public static void main(String[] args) { //实例外部类对象 Test test=new Test(); //实例化内部类对象 Happy happy=test.new Happy(); happy.test(); }
注意点:
01定义成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象,eg:内部类 对象名=外部类对象.new 内部类();
02.外部类是不能调用内部类的成员和方法,可以先创建内部类对象在调用成员变量和方法。
03.如果外部类和内部类具有相同的成员变量和方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量和方法可以通过this关键字实现。
内部类默认调用自己的成员变量:
//外部类Test public class Test { private int b=10;//外部类的私有属性 //内部类happy public class Happy { int b=20;//内部类的成员属性 public void test() { System.out.println("b:"+b); } } //main方法 public static void main(String[] args) { //实例外部类对象 Test test=new Test(); //实例化内部类对象 Happy happy=test.new Happy(); happy.test(); }
输出结果:20
内部类通过this关键字调用外部类的成员变量:
//外部类Test public class Test { private int b=10;//外部类的私有属性 //内部类happy public class Happy { int b=20;//内部类的成员属性 public void test() { System.out.println("b:"+Test.this.b); } } //main方法 public static void main(String[] args) { //实例外部类对象 Test test=new Test(); //实例化内部类对象 Happy happy=test.new Happy(); happy.test(); }
输出结果:10
04.还有一个值得关注的地方就是:此时编译后的文件会生成两个即两个.class文件
其中,第二个是外部类的.class文件,第一个是内部类的.class文件,所有要注意的是成员内部类的.class文件是这样:外部类名$内部类名.class
四.Java中的静态内部类
所谓静态内部类,当然是是用static修饰的内部类。
//外部类 public class Test { static int result=2;//外部类静态属性 //静态内部类Happy public static class Happy { int result=3;//内部类属性和外部类静态属性同名 public void test() { System.out.println("访问外部类中的result:"+Test.result); System.out.println("访问内部类中的result:"+result); } } //main方法 public static void main(String[] args) { //直接创建内部类对象 Happy happy=new Happy(); happy.test(); } }
注意点:
01.静态内部类不能直接访问外部类的非静态的成员,但可以通过new 外部类().成员的方法访问。
02.如果外部类的静态成员和内部类的静态成员的名称相同的话,可以通过类名.静态成员访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可以通过成员名直接的调用静态成员。
03.创建静态内部类的对象时,不需要外部类的对象,可以直接创建内部类 对象名=new 内部类();
五.java中的方法内部类
方法内部类是定义在外部类的方法中,方法内部类只在该方法的内部可见。
//外部类 public class Happy { //外部类的方法 public void show() { final int a=1;//常量 //方法内部类 class Test { int c=3; //方法内部类中的方法 public void print() { System.out.println("外部类方法中的a:"+a); System.out.println("内部类c:"+c); } } //创建方法内部类的对象 Test test=new Test(); test.print(); } public static void main(String[] args) { Happy happy=new Happy();//实例化外部类 happy.show(); } }
注意:
01方法内部类不能再外部类的而方法以外的地方使用。
02方法内部不能使用访问修饰符合static修饰符