java内部类
来源:互联网 发布:北京柒柒网络团队骗 编辑:程序博客网 时间:2024/06/11 03:51
把类定义在其他类的内部,这个类就被称为内部类。
内部类的访问特点:
1、内部类可以直接访问外部类的成员,包括私有。
2、外部类要访问内部类的成员,必须创建对象。
按照内部类在类中定义的位置不同,可以分为:
1、成员位置(成员内部类)
2、局部位置(局部内部类)
成员位置的内部类
package org.danni.Demo1;class Outer{ private int num = 10; //成员内部类 class Inner{ public void show(){ System.out.println(num); } }}public class InnerClassDemo { public static void main(String[] args) { //外部类名.内部类名 对象名 = 外部类对象.内部类对象 //因为是成员位置,所以要先创造Outer对象,然后在访问里面的Inner,要访问Inner里面的方法,所以要创建Inner对象 Outer.Inner io = new Outer().new Inner(); io.show(); //10 }}
成员内部的常见修饰符:
1、private 为了保证数据的安全性
2、static 为了让数据访问更方便
静态内部类访问的外部类数据必须用静态修饰
内部类被静态修饰后的方法:有静态方法和非静态方法
成员内部类被静态修饰后的访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
package org.danni.Demo1;class Out{ private int num = 10; private static int num2 = 100; //静态内部类访问外部类数据必须用静态修饰 public static class In{ public void show(){ //System.out.println(num); System.out.println(num2); } public static void show2(){ //System.out.println(num); System.out.println(num2); } }}public class InnerClassDemo2 { public static void main(String[] args) { //成员内部类被静态修饰后的访问方式 //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名(); Out.In oi = new Out.In(); oi.show(); //100 oi.show2(); //100 Out.In.show2(); //100 }}
局部位置的内部类
1、可以直接访问外部类的成员
2、在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。
package org.danni.Demo2;class Outer{ private int num = 10; public void method(){ class Inner{ public void show(){ System.out.println(num); } } Inner i = new Inner(); i.show(); }}public class Test { public static void main(String[] args) { Outer o = new Outer(); o.method(); //10 }}
局部内部类访问局部变量必须用final修饰。
因为局部变量会随着方法的调用完毕而消失,但是这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰。加了final修饰后,这个变量就变成了常量。既然是常量,你消失了,我在内存中存储的还是那个数据,还是有数据在使用。final存储在堆内存中,堆内存的内容不会立即消失,只有垃圾回收机制回收的时候才会消失。
package org.danni.Demo2;class Outer{ private int num = 10; //局部内部类访问局部变量必须用final修饰 public void method(){ final int num2 = 20; class Inner{ public void show(){ System.out.println(num); System.out.println(num2); } } //被垃圾回收机制回收的时候对象才消失。所以还会要用到num2变量。 //要还能够使用,使用final类型,存储在堆内存中,只有垃圾回收机制回首才消失。这样就可以了。 Inner i = new Inner(); i.show(); }}public class Test { public static void main(String[] args) { Outer o = new Outer(); o.method(); //10 20 }}
匿名内部类
1、内部类的简化写法。
2、前提:存在一个类或者接口。这里的类可以是具体类也可以是抽象类。
3、格式:new 类名或者接口名( ) { 重写方法; }
4、本质:是一个 继承了类或者实现了接口的 子类匿名对象
package org.danni.Demo2;interface Inner{ public abstract void show();}class Outer{ public void method(){ new Inner(){ public void show(){ System.out.println("show"); } }.show(); //new只是声明了一个匿名类对象,他是个对象,需要继续调用才会有结果。 }}public class TestDemo { public static void main(String[] args) { Outer o = new Outer(); o.method(); //show }}
当是如果接口中有很多个方法要实现的时候,就很麻烦了,如下。(有改进方法)
package org.danni.Demo2;interface Inner{ public abstract void show(); public abstract void show2();}class Outer{ public void method(){ new Inner(){ public void show(){ System.out.println("show"); } public void show2() { System.out.println("show2"); } }.show(); new Inner(){ public void show(){ System.out.println("show"); } public void show2() { System.out.println("show2"); } }.show2(); }}public class TestDemo { public static void main(String[] args) { Outer o = new Outer(); o.method(); //show show2 }}
改进方法:
package org.danni.Demo2;interface Inner{ public abstract void show(); public abstract void show2();}class Outer{ public void method(){ //多态(父接口 = 子类对象) Inner i = new Inner(){ public void show(){ System.out.println("show"); } public void show2() { System.out.println("show2"); } }; i.show(); i.show2(); }}public class TestDemo { public static void main(String[] args) { Outer o = new Outer(); o.method(); //show show2 }}
package org.danni.Demo3;interface Person{ public abstract void study();}class PersonDemo{ public void method(Person p){ p.study(); }}public class Test { public static void main(String[] args) { PersonDemo pd = new PersonDemo(); pd.method(new Person(){ public void study(){ System.out.println("study"); } }); }}
匿名内部类好处:用完之后就是垃圾,可以立马被回收,栈内存中没有东西指向它。
- 【Java】【内部类】Java 内部类简介
- [Java] Java 内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- java的内部类、匿名内部类、局部内部类
- java内部类之成员内部类、静态内部类
- java 成员内部类 局部内部类,匿名内部类
- Java 静态内部类/内部类
- java内部类、静态内部类 小结
- Java内部类,静态内部类
- JAVA 内部类与静态内部类
- java内部类--局部内部类
- Java 内部类以及匿名内部类
- JS DOM 绑定的三种方法
- springboot(五)filter/interceptor/listener
- JAVA解析xml DOM SAX JDOM DOM4J
- 课工场 “微服私访”项目学习(二)
- Sqlserver2005-几种分页sql语句的比较
- java内部类
- 【JavaSE学习笔记】IO流02_字节输出流OutputStream、字节输入流InputStream
- Java并发集合的实现原理
- Meta http-equiv用法详解
- 输入:包含条形码图形和条形码文本的图片 输出:条形码的文本
- cmake编译ITK报错:The C compiler is not able to compile a simple test program
- linux中/etc/init.d的作用
- POJ
- (3)HttpServletRequest