内部类(上)

有名内部类

内部类是指在一个外部类内定义的类。

按照是否有类名分为有名内部类和匿名内部类。

说明:全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围;

public class Foo {
	
	class A{
		
	}
	
	public static void main(String[] args) {
		class B{
			
		}
	}
}

A和B都是内部类,A类似于全局变量 ,在Foo类的任何位置都可以调用,但B类只能在定义之后的后面调用。

匿名内部类

匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:

 new 父类构造器([参数列表])|接口(){      

    //匿名内部类类体

普通类匿名内部类实质为普通类的子类。

public class Foo {
	
	public static void main(String[] args) {
		Mammal1 q = new Mammal1(){
			@Override//可以重写父类的方法
			public void a() {
				System.out.println(222);
			}
		};
	}
}

class Mammal1{
	public void a() {
		System.out.println(111);
	}
}

抽象类:抽象类匿名内部类实质为抽象类的子类。必须实现父类抽象类或接口中包含的所有抽象方法。

public class Foo {
	
	static Mammal1 q = new Mammal1(){
		@Override
		public void a() {
			
		};
	};
	
	public static void main(String[] args) {
		Mammal1 w = q;
		w.a();
	}
}

abstract class Mammal1{
	public void a() {
		System.out.println(111);
	}
}

接口:接口匿名内部类实质为接口的实现类。

public class Foo {
	
	static Mammal1 q = new Mammal1(){
		@Override
		public void a() {
			
		}
	};
	
	public static void main(String[] args) {
		Mammal1 w = q;
		w.a();
	}
}

interface Mammal1{
	public void a();
}

匿名内部类特点:
匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类;
匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量;
匿名内部类一定不能是抽象类;
可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的 匿名内部类对象所调用,例如:

public class Foo {
	
	public static void main(String[] args) {
		new Mammal1(){
			@Override
			public void a() {
			}
			public void b() {
			}
		}.b();//同一个匿名内部类对象只能调用一个新增的属性或方法,无法再调用实现的抽象方法、重写的方法或继承的方法,也无法调用继承的属性
	}
}

interface Mammal1{
	public void a();
}

按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,非静态内部类前面已经讲过,这里不再赘述。

静态匿名内部类;

public class Foo {
	static Mammal1 a = new Mammal1(){
		@Override
		public void a() {
			
		}
		
		public void b() {
			
		}
	};
}

interface Mammal1{
	public void a();
}

如果为static内部类只能直接定义在外部类中。

匿名内部类定义位置的区别

直接定义在外部类中的匿名内部类必须实例化,因为如果不实例化就永远不会被调用

public class Foo {

	new Mammal1(){//报错
		@Override
		public void a() {
			System.out.println(111);
		}
		
		public void b() {
			
		}
	};
	public static void main(String[] args) {
		a.a();
	}
}
public class Foo {

	new Foo();//报错
}

只有实例化后才能直接在外部类中调用。匿名内部类里面新创建的方法只能通过在类后面加上点后调用,而且只能在方法或代码块中没有实例化时调用,且只能调用一个,多余的不能调用。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值