内部类(下)

静态内部类

静态内部类仅能直接访问外部类的静态成员变量和方法,可以通过创建外部类的对象间接使用非静态的成员变量和方法。

public class Foo {

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

interface Mammal1{
	public void a();
}

在非外部类中定义的内部类和局部变量一样,其使用范围从定义的位置开始到其所在直接语句块结束。

只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)

类的调用方法:

public class Foo {

	final static int a = 9;
	final static int b = 2;
	class Sum{
		public void sum(int a,int b) {
			System.out.println(a+b);
		}
	}
	
	Ma d = new Ma() {

		@Override
		public void a() {
		}
	};
	public static void main(String[] args) {
		new Foo().new Sum().sum(a, b);//内部类调用方法
		new Foo().d.a();              //匿名内部类调用方法
	}
}

abstract class Ma{
	public abstract void a();
}

 

 

 

内部类特点(总结)

内部类特点:

内部类是一个独立的类:编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名+$+内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类的类名+$+数字;

普通外部类、抽象类和接口可以有内部类(匿名的或有名的);

内部类可以直接定义在类中,也可以定义在方法或代码块中;其中直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);但是定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。

内部类可以访问外部类的所有访问权限的成员变量

在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。

从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以不使用final修饰。

lambda表达式

Java支持Lambda 表达式始于Java 8,它的出现简化了函数式接口匿名内部类的语法,其表达式语法如下:([参数1], [参数2], [参数3],.... [参数n])->{代码块}

public class Foo {

	Ma s = ()->{
		System.out.println(111);
	};
}
@FunctionalInterface
interface Ma{
	public abstract void a();
}

这段代码相当于:

public class Foo {

	Ma s = new Ma(){

		@Override
		public void a() {
			System.out.println(111);
		}
	};
}
@FunctionalInterface
interface Ma{
	public abstract void a();
}

显而易见,代码简化了许多。

如果方法没有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->单行语句

如果方法有返回值且只有一行代码,则Lambda表达式语法可以是这种形式:([参数1], [参数2], [参数3],.... [参数n])->表达式

public class Foo {

	Ma s = (int i)->i;
}
@FunctionalInterface
interface Ma{
	public abstract int a(int i);
}

 

你可能感兴趣的:(Java基础)