基础--java内部类学习

一、内部类

把一个类的定义放在另一个类中,这个类就是内部类。


二、内部类分类

1、成员内部类(最常见的内部类,内部类的定义与类成员平级)
2、局部内部类( 局部内部类,是指内部类定义在方法和作用域内)
3、匿名类
4、静态内部类
5、接口内部类


三、使用方法

1、内部类直接在类的内部进行声明。可以声明为private、protected、public或者默认访问权限,这个访问权限约定和外部类完全一样。
2、内部类自动拥有对其外围类所有成员(方法、属性)的访问权。如果内部类和外部类成员的名字完全相同,在内部类方法中要访问外部类成员,则需要使用下面的方式来访问: 外部类名.this.外部成员名,例如Outer.this.i++;  (看例子)
3、必须使用外部类对象来创建内部类对象,而不是直接去new一个。
格式为: 外部对象名.new 内部类构造方法
比如要创建一个内部类iner对象,需要这么做:
        Outer outer = new Outer();
        Outer.Inner iner = outer.new Inner();

四、举例

1、成员内部类

public class OutClass {

	private int value=0;
	public static void main(String[] args) {
		OutClass oc = new OutClass();
		Inner in = oc.new Inner();
		in.display();
		
		Inner in2 = oc.getInnerClass();
		in2.display();
	}

	public Inner getInnerClass(){
		return new Inner();
	}
	
	public class Inner{
		
		public Inner(){
			this.value = OutClass.this.value;
		}
		
		private int value;

		public int getValue() {
			return value;
		}

		public void setValue(int value) {
			this.value = value;
		}
		
		public void display(){
			System.out.println("value="+this.value);
		}
	}
}
2、局部内部类

interface innerface{
	public void display();
}

public class OutClass {

	private int value=123;
	public static void main(String[] args) {
		OutClass oc = new OutClass();
		innerface in = oc.test();
//		Inner in = oc.test(); //编译不通过,因为Inner在方法内部,方法体外不能使用,必须返回接口
		in.display();
	}

	public innerface test(){
		class Inner implements innerface{
			
			public Inner(){
				this.value = OutClass.this.value;
			}
			
			private int value;

			
			@Override
			public void display(){
				System.out.println("value="+this.value);
			}
		}
		return new Inner();
	}
	
}
再看另外一种:

public class OutClass {

	private int value=123;
	public static void main(String[] args) {
		OutClass oc = new OutClass();
		oc.test();
	}

	public void test(){
		if(Boolean.TRUE){
			class Inner{
				
				public Inner(){
					this.value = OutClass.this.value;
				}
				
				private int value;

				public void display(){
					System.out.println("value="+this.value);
				}
			}
			Inner in = new Inner();
			in.display();
		}
		
	}
	
}
3、匿名内部类

匿名内部类是不能加访问修饰符的

interface innerface{
	public void display();
}

public class OutClass {
	private int value=123;
	private static int v = 456;
	public OutClass(){
		System.out.println("Out create");
	}
	public static void main(String[] args){
		OutClass out = new OutClass();
		out.test();
	}
	private void test(){
		new innerface(){
			@Override
			public void display() {
				System.out.println("OK");
			}
		}.display();
	}
}

4、静态内部类

就是修饰为static的内部类。

a.和普通的内部类还有一个区别:普通内部类不能有static数据和static属性
b.静态内部类是static class型的内部类,这种内部类特点是:它不能访问外部类的非静态成员。要创建静态内部类对象时候,也不需要外部类对象了,直接可以:new 外部类名.内部类构造方法
public class OutClass {
	private int value=123;
	private static int v = 456;
	public OutClass(){
		System.out.println("Out create");
	}
	public static void main(String[] args) {
		Inner inner = new OutClass.Inner();
		inner.display();
	}
	public static class Inner{
		public Inner(){
			this.value = OutClass.v;//无法访问非静态的成员
			System.out.println("Inner create");
		}
		private int value;
		public void display(){
			System.out.println("value="+this.value);
		}
	}
}
5、接口内部类
接口内部类自动都是public static的,相当于为接口定义了一种变量类型,这在java的设计中就有使用,比如在HashMap中,就有:
static class Entry<K,V> implements Map.Entry<K,V>
interface innerface{
	public void display();
	class innerClass{ //默认是public static
		public void mark(){
			System.out.println("test");
		}
	}
}

public class OutClass {
	public OutClass(){
		System.out.println("Out create");
	}
	public static void main(String[] args){
		innerface.innerClass inner = new innerface.innerClass();
		inner.mark();
	}
}

还有其他部分,比如内部类的嵌套和继承,就不做介绍了。用的不多吧。

内部类最明显的好处就是实现了java的短板,不能多继承,而内部类可以变通的做到。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值