java-内部类介绍

内部类(Nested Class) 嵌套类:
(1)静态内部类
(2)非静态内部类:

  • 普通内部类(成员内部类):在一个外部类中直接定义的内部类。
  • 匿名内部类:
  • 方法内部类:在一个方法(外部类中的方法)或代码块中定义的内部类。
内部类仍然是一个独立的类,在编译之后内部类会被单独编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
内部类可以使用修饰符(public ,protected,default,private)。
静态内部类的基本用法:
1.静态内部类可以包含静态成员,非静态成员。
2.静态内部类可以直接调用外部类的经验属性,静态方法。单不能调用外部类的普通属性,普通方法。
3.在不相关类中,可以直接创建静态内部类的对象(不需要通过所在的外部类)。
4.静态内部类实际上和外部类联系很少,也就是命名空间上的联系。
方法内部类的基本用法:
1.方法内部类的地位和方法内的局部变量的位置类似,均不可被修饰符修饰。
2.方法内部类只能在生命的方法内是可见的。因此定义局部内部类之后,想用的话就要在此方法内直接实例化,一定是先声明后使用。
3.方法内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final,及局部变量和方法内部类生命周期不一致。
4.方法内部类只能包含非静态成员。
5.方法内部类中不能引用所在方法的普通局部变量,除非是常量。方法的生命周期和方法内部类对象的生命周期不一致。
匿名内部类的基本用法:
匿名内部类的实例化方式:new SomeInterfaceOrClass(){?};
意味着创造一个实现或者说继承了SomeInterfaceOrClass类的对象。
Ps:根据声明的位置,判断匿名内部类是成员内部类还是方法内部类。一般是方法内部类。
三种使用方法:
继承方式,接口方式,以及参数方式
通过代码了解一下:
1 package com.etc; 2 3 import java.util.Date; 4 5 @SuppressWarnings("all") 6 public class NestedClassDemo { 7public static void main(String[] args) { 8 9Test4 test=new Test4(); 10test.test(); 11//不相关的内部类调用及实例化 12Test4.Test t1=new Test4.Test(); 13//成员内部类的实例必须借助外部类 14Test4.Test2 t2=test.new Test2(); 15System.out.println("不相关内部类:"+t1.getClass()); 16System.out.println("成员内部类:"+t2.getClass()); 17useCarForTest us=new useCarForTest(); 18System.out.print("继承式匿名内部类使用结果:"); 19us.use(); 20System.out.print("参数式匿名内部类使用结果:"); 21us.useElement(); 22} 23 } 24 25 @SuppressWarnings("all") 26 class Test4{ 27 28static int a=10; 29int b=20; 30//静态内部类 31static class Test{ 32private void printA() { 33System.out.println(a); 34//静态内部类中不能调用外部类的普通成员 35//System.out.println(b); 36} 37} 38//普通内部类 39class Test2{ 40//成员内部类中不能有静态的成员,除非声明为final,并且只能是编译器可以确定值的常量表达式 41int a=10; 42final static int b=20; 43/*final static Date date=new Date(); */ 44} 45 46//方法内部类,局部内部类 47public void test() { 48 49class Test3{ 50 51} 52//匿名内部类也可以放在方法内部类里面、为继承式匿名内部类使用 53Runnable run=new Runnable() { 54@Override 55public void run() { 56System.out.println("测试1"); 57} 58}; 59} 60 61//定义了匿名内部类的类体,同时创建了一个匿名内部类的实例。 62Runnable run=new Runnable() { 63@Override 64public void run() { 65System.out.println("测试2"); 66} 67}; 68 } 69 70 71 72 class useCarForTest{ 73 74public void element(Car car) { 75car.say(); 76} 77//匿名内部类的使用,参数式 78public void useElement() { 79element(new Car() { 80@Override 81public void say() { 82System.out.println("这是一辆奔驰"); 83} 84}); 85} 86 87//匿名内部类的使用,继承式 88public void use() { 89Car car=new Car() { 90@Override 91public void say() { 92System.out.println("这是一辆保时捷!"); 93} 94}; 95car.say(); 96} 97 } 98 99 class Car{ 100public void say() { 101System.out.println("这是一辆车!"); 102} 103 }


运行效果截图:
java-内部类介绍
文章图片


java-内部类介绍
文章图片

ps:文章待完善,后续补全。

【java-内部类介绍】转载于:https://www.cnblogs.com/weekstart/p/10852164.html

    推荐阅读