Java中的静态内部类与非静态内部类

非静态内部类

在类中直接定义的内部类,其作用可以参考成员变量
①非静态内部类在非静态方法中被调用

public class Body {
	int age = 12;
	class Heart{//非静态内部类
		void work() {
			System.out.println("doing......");
		}
	public void getHeart() {
		System.out.println(this.age);//调用成员变量
		Heart heart = this.new Heart();//创建内部类对象
	}
}
public class AnBody{
	public void listen(){
		Body body = new Body();
		Heart heart = body.new Heart();
	}
}

因为此非静态方法在外部类中,所以在此可用this或不写(默认有this),在其他类的非静态方法中调用,则必须创建外部类对象。

②非静态内部类在静态方法中被调用

public class Body {
	int age = 12;
	class Heart{//非静态内部类
		void work() {
			System.out.println("doing......");
		}
	public static void getHeart() {
		System.out.println(new Body().age);//调用成员变量
		Heart heart = new Body().new Heart();//创建内部类对象
	}
}

在静态方法中调用非静态内部类时,必须通过实例化外部类对象来调用。

在方法中定义的非静态内部类,可以通过直接实例化内部类对象使用

public class Body {
	public static void main(String [] args){
		class Test{
		}
		Test test=new Test();//在方法中定义的非静态内部类,可以通过直接实例化内部类对象使用
	}
}

静态内部类

①静态内部类在方法中被调用(静态内部类只能直接定义在类中)

public class Body {
	static int age = 12;
	static class Heart{//静态内部类
		void work() {
			System.out.println("doing......");
		}
	public void getHeart() {
		System.out.println(age);//调用成员变量
		Heart heart = new Body.Heart();//创建内部类对象
	}
}
public class AnBody{
	public void listen(){
		Heart heart = new Body.Heart();
	}
}

因为此方法在外部类中,所以在此可用外部类名点或不写,在其他类的方法中调用,则必须指明外部类名。

②只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图,左侧是不被允许的,只有有名静态内部类中才允许有静态成员

补充

关于static

①static(静态):在定义成员变量,方法,内部类时的一个修饰词
②Jvm中:静态的在类加载的时候处理:静态变量直接赋值、静态方法直接分配地址、静态代码块直接执行。
③与非静态的不同:非静态的只能在创建对象时执行操作,故对于静态内存分配及执行先于非静态
④一个类中局部作用范围不能由static修饰

Lambda

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

interface Iway{
	int add(int a,int b);
}//一个接口Iway
class Test {
	public static void main(String[] args) {
	/*Iway imp=new Iway() {
		public int add(int a,int b) {
			return a+b;
		}
	};//匿名内部类实现接口*/
	Iway imp =(int a,int b)- >{
		return a+b;
	};
	}
}

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

interface Iway{
	int add(int a,int b);
}//一个接口Iway
class Test {
	public static void main(String[] args) {
	/*Iway imp =(int a,int b)- >{
		return a+b;
	};*/
	Iway imp =( a, b)- >return a+b;//简化后的Lambda表达式
	}
}

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

interface Iway{
	void add(int a,int b);
}//一个接口Iway
class Test {
	public static void main(String[] args) {
	/*Iway imp =(int a,int b)- >{
		System.out.println(a+b);
	};*/
	Iway imp =( a, b)- >System.out.println(a+b);//简化后的Lambda表达式
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值