Java学习-内部类

一、概念

内部类:在一个类的内部定义的一个类;
分类: 可以分为 成员内部类、局部内部类、匿名内部类和静态内部类;

《Think in java》):
1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
3、创建内部类对象的时刻并不依赖于外围类对象的创建。
4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

二、各种内部类的介绍
1.成员内部类

特点:
1.成员内部类可以直接访问外部类的成员(包括private定义的成员),而外部类不能直接访问内部类的成员属性和方法。
2.成员内部类是依附在外部类,需要先创建外部类对象才能创建内部类对象;
3.成员内部类区别于静态内部类,成员内部类中不能存在static的成员和方法;

//相对于内部类,这是外部类
public class Outer {
   private int out = 1;//private的外部类变量
   
   public void OutPrint() {
   	System.out.println("Out:"+out);
   }
   
//内部类
   public class Inner {
   	int inn;
   	
   	public void InPrint() {
   		System.out.println("In中的Out:"+out);//可以使用外部类的成员变量
   		OutPrint();//可以使用外部类的方法
   	}
   }
//
}

public class Show {

   public static void main(String[] args) {
   	Outer o = new Outer();//1.外部类创建对象
   	Outer.Inner i = o.new Inner();//2.外部类的对象创建后,创建内部类对象
//		Inner i = new Inner();不会报错但是是无效定义方式
//		Outer.Inner j = new Outer().new Inner();//结合1和2直接创建也是可行的
   	i.InPrint();
   }

}
console结果:
In中的Out:1
Out:1

2.局部内部类
概念: 定义在外部类方法或作用域内的类

特点:
1.局部内部类可以直接访问外部类的成员;
2.在局部位置可以创建局部内部类对象,通过对象调用成员;
3. 局部内部类在访问局部变量时,被访问的变量必须用 final 修饰;

3.匿名内部类

简单写法:

 new 父类(){
 重写方法;
 };
 new 接口(){
 实现方法;
 };

特点:
1.匿名内部类我们必须是继承一个父类或者实现一个接口,不能是抽象的;
2.匿名内部类仅能被使用一次因为匿名内部类是直接使用new来生成一个对象的引用,该类的定义会立即消失;
3.匿名内部类中是不能定义构造函数的,匿名内部类中不能存在任何的静态成员变量和静态方法;
4.匿名对象可以作为实际参数传递;
5.如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的;

使用时机: 当一个对象只需要使用一次可以使用,匿名对象使用完毕就变成垃圾被回收;

//抽象类
public abstract class Person {
	String name;
	int age;
	
	public abstract void Print();
}

//接口
public interface PlayBall {
	public abstract void Play();
}

//
public class Show {
	//定义一个测试匿名类对象可以作为形参传递的方法
	public static void Test(Person pp) {
		pp.Print();
	}

	public static void main(String[] args) {
		//创建抽象类的匿名内部类
		new Person() {
			public void Print() {
				System.out.println("hello");
			}
		};
		//使用new创建匿名内部类后,直接引用其成员
		new Person() {
			public void Print() {
				System.out.println("hello");
			}
		}.Print();
		
		//通过多态创建对象
		Person a= new Person() {
			public void Print() {
				System.out.println("hello");
			}
		};
		a.Print();
		
		//匿名类对象作为形参
		Show.Test( new Person() {
			public void Print() {
				System.out.println("hello");
			}
		});
		
		//创建接口的内部类,同样道理,可以通过多态创建对象
		PlayBall p = new PlayBall() {
			public void Play() {
				System.out.println("踢足球");
			}
		};
		p.Play();
	}
}


console结果:
hello
hello
hello
踢足球

4.静态内部类
使用static修饰的内部类
特点:
1.不能访问任何外部类的非static成员变量和方法
2.静态内部类可以直接创建实例不需要依赖于外围类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值