java内部类(普通内部类、方法内部类、静态内部类、匿名内部类)

java内部类通常分为普通内部类、方法内部类、静态内部类、匿名内部类,这里分别讲解。

一、普通内部类:(内部类是外部类的一个成员 但是也是一个类)
(不能定义静态内容只能定义静态常量且常量要赋字面值)
1、外部类成员访问内部类的成员:创建内部类实例

public class TestInner {
			public static void main(String[] args) {
				new Outer().method();
			}
		}
		class Outer{
			String name;
			int age;
			public void method() {
				System.out.println("外部内成员方法");
				Inner inner = new Inner();
				System.out.println("输出内部类num="+inner.num);
			}
			class Inner{
				int num = 10;
			}
		}
	2、其他类访问内部类:
		a.创建内部类对象:创建时要求必须保证外部类对象存在 	
		b.外部类.内部类 变量名= new 外部类().new 内部类();
		Outer.Inner inner = new Outer().new Inner();
	 3、内部类访问外部类成员:
	      a.要是内部类中成员名字和外部内成员名字相同,直接使用就是就近原则,
	        如果需要使用外部类成员,用外部类名.this.成员变量名
	        例如:
				class Outer{
					int num = 10;
					class Inner{
					  int num = 20;
					  System.out.println(Outer.this.num);//这就是调用外部类的同名成员
					}
				}

二、方法内部类
1.见名知其意,这个内部类是在方法中的,所以这个类是局部变量,具有局部变量的特性, 局部变量不能用static关键字修饰:

    class Outer2{
	int age;
	String name;
	public void method(){//static不能修饰局部变量。
	    class Inner{//首次这个类是这个方法里面的,只能是一个局部变量。
	       int num = 9;
	    }
	}
}
2、外界类不能访问方法内部类,换句话说,成员方法中的内容是不能被访问的,方法中的内容需要访问方法内部类,也是创建
  对象的方式访问。
3、方法内部类可以缩减内存开销,因为局部变量生命周期短。

三、静态内部类
1、静态内部类需明确的是它是一个外部类的静态成员,同时是一个类。
2、外部类成员访问静态内部类时:
a.访问静态内部类的非静态成员,创建实例对象
b.访问静态内部类的静态成员,直接通过类名.

    class Outer3{
	
	public void method() {
		System.out.println(Inner.num);//非静态
		System.err.println(new Inner().temp);//静态
	}
	static class Inner{
		static int num = 20;
		int temp = 40;
	}
}
3、静态内部类访问外部类的成员
  a.非静态成员,创建外部类实例对象访问
  b.静态成员,直接用
  c.提示:成员变量和成员方法一样,方法自行验证。
    class Outer3{
	static int num1 = 10;
	int num2 = 20;
	static class Inner{
		public void inMethod() {
			System.out.println(num1);
			System.out.println(new Outer3().num2);
		}
	}
}
4、外界类访问静态内部类中的内容
  a.访问静态内部类的静态内容
     外部类名.内部类名.静态成员名
  b.访问非静态内部类的非静态内容(创建一个静态内部类实例)
     外部类名.内部类名().静态成员名
public class Test {
	public static void main(String[] args) {
		System.out.println(Outer3.Inner.temp2);
		System.out.println(new Outer3.Inner().temp1);
	}
}
class Outer3{
	static class Inner{
		int temp1 = 21;
		static int temp2 = 11;
	}
}

四、匿名内部类
1、可以用来创建接口的实现类对象或抽象类的子类对象
而这些对象只需要被使用一次,用匿名内部类实现,使
用完就可以被回收,减少内存压力。
2、使用方法:
new 接口/抽象类(){
重写所有的抽象方法;
};
3、不使用匿名内部类和使用匿名内部类的代码区别
a.不使用匿名内部类代码:

    public class Test{
	public static void main(String[] args) {
		Animal animal = new Dog();
		animal.run();
	}
}
interface Animal{
	public void run();
}
class Dog implements Animal{
	
	@Override
	public void run() {
		System.out.println("狗会跑步!!!");
	}
}
b.使用匿名内部类代码:
  public class Test{
	public static void main(String[] args) {
		Animal animal = new  Animal{
			@Override
			public void run() {
				System.out.println("狗会跑步!!!");
			}
		};
		animal.run();
	}
}
interface Animal{
	public void run();
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值