Java基础——内部类(成员内部类、局部内部类、匿名内部类的定义和调用方式)

1、 什么是内部类

将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。

2、内部类的分类

内部类分为成员内部类与局部内部类。

我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。

①成员内部类:

1、成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
2、成员内部类可以使用成员修饰符:public、static…,它是一个类,可以继承、可以实现接口

成员内部类定义格式:

class 外部类 { 
	修饰符 class 内部类 {
		//其他代码
	}
}

成员内部类代码演示:

public class Outer {
	private int i = 1;
	//外部类成员的位置,定义内部类
	class Inner {
		public void inner() {
			System.out.println("内部类方法inner "+ i);
		}
	}
}

调用规则:

  • 	内部类可以使用外部类成员,包括私有  
    
  • 	外部类使用内部类必须建立内部类对象
    

访问方式:

外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

结合上面成员内部类的例子,代码演示:

public class Outer_Test {

	public static void main(String[] args) {
		/*
		 * 调用外部类中内部类的方法inner
		 * 
		 * 依靠外部类对象找到内部类,利用内部类对象,调用内部类方法
		 *  访问方式:
					外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
					变量名.内部类方法;
		 */
		Outer.Inner in = new Outer().new Inner();
		in.inner();
	}
}

②局部内部类:

1、局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
2、局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问

局部内部类定义格式
class 外部类 { 
	修饰符 返回值类型 方法名(参数) {
		class 内部类 {
			//其他代码
		}
	}
}

局部内部类代码演示:

public class JuBu_Outer {
	public void out() {
		class Inner{
			public void inner() {
				System.out.println("局部内部类方法inner");
			}
		}
//		在外部类方法中,创建内部类对象
		Inner in = new Inner();
		in.inner();
	}
}

访问方式:

在外部类方法中,创建内部类对象,进行访问

结合上面局部内部类的例子,代码演示:

public class JuBu_Outer_Test {

	public static void main(String[] args) {
		//调用局部内部类方法inner
		new JuBu_Outer().out();

	}

}

3、内部类的实际使用——匿名内部类
一、定义的匿名内部类有两个含义:

① 临时定义某一指定类型的子类
② 定义后即刻创建刚刚定义的这个子类的对象
③匿名内部类属于局部内部类

二、定义匿名内部类的作用与格式
1、作用:

匿名内部类是创建某个类型子类对象的快捷方式。

格式:

new 父类或接口(){
	//进行方法重写
};

匿名内部类代码演示:

public interface NiMing_inter {
	//创建一个接口,里面有两个抽象方法
	public abstract void smoking();
	public abstract void playing();
}
public class NiMing_interTest {
	
	public static void main(String[] args) {
		//使用内部类实现smoking()、playing()方法
/*
		 * 定义实现类、重写方法、建立实现类对象,合为一步完成
		
		格式:
				new 父类或接口(){
					//进行方法重写
				};		
 */	
		new NiMing_inter() {		//new 父类或接口()
			public void smoking() {		//smoking方法重写
				System.out.println("人在吸烟!");
			}
			public void playing() {		//playing方法重写
				System.out.println("人在玩耍!");
			}
		}.smoking();//调用重写方法
		new NiMing_inter() {		//new 父类或接口()
			public void smoking() {		//smoking方法重写
				System.out.println("人在吸烟!");
			}
			public void playing() {		//playing方法重写
				System.out.println("人在玩耍!");
			}
		}.playing();//调用重写方法
		
//		利用多肽性,父类引用 = 子类对象
		System.out.println("\n——————多态性调用——————");
		NiMing_inter i = new NiMing_inter() {
			public void smoking() {		//smoking方法重写
				System.out.println("人在吸烟!");
			}
			public void playing() {		//playing方法重写
				System.out.println("人在玩耍!");
			}
		};
		i.smoking();
		i.playing();
	}
}

从new开始,到;(分号)结束,创建了接口NiMing_inter实现类的对象:

new NiMing_inter() {		//new 父类或接口()
			public void smoking() {		//smoking方法重写
				System.out.println("人在吸烟!");
			}
			public void playing() {		//playing方法重写
				System.out.println("人在玩耍!");
			}
		};

以上代码也是NiMing_inter的子类匿名对象

原因:

1、使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成。
2、虽然是两个步骤,但是两个步骤是连在一起完成的。
3、匿名内部类如果不定义变量引用,则也是匿名对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值