详述静态内部类与非静态内部类

本文深入解析Java中的内部类概念,区分静态与非静态内部类,阐述它们的创建方式及访问特性,同时探讨静态匿名内部类的使用场景。通过具体代码示例,帮助读者理解内部类在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类。
非静态内部类:

package pro1;
public class Body {
 class Heart{
 int age;
 void work() {
 	System.out.println("正在睡觉");
 	}
 	public void getHeart() {
 	Heart heart=(this.)new Heart();//非静态方法调用直接创建在类中的非静态内部类,创建对象的时候必须先创建外部类对象,但是有默认this
 	}
 	public static void getHeart(int a) {
 	Heart heart=new Body().new Heart();//静态类方法调用直接创建在类中的非静态内部类,在静态方法中创建对象,必须显式创建外部类对象
 	}

静态内部类:

package pro1;
public class Body {
static class Heart{
  int age;
   void work() {
   	System.out.println("正在睡觉");
   	}
   	public void getHeart() {
   	Heart heart=new Heart();//调用静态类可以直接创建对象调用
   	}
   	public  static void  getHeart(int a) {
   	Heart heart=new Heart();//静态方法调用静态类可以直接调用
   	}
   }
}   	

在这里插入图片描述
静态匿名内部类

class Father{
public void eat() {
	System.out.println("筷子吃饭....");
		}
	}
/*外部类*/
public class OutClass {
/*静态匿名内部类*/
static Father son = new Father(){
	@Override
	public void eat() {
		System.out.println("筷子吃饭....");
		}
	};	
}
	

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

public class OutClass {
public static void main(String[] args) {
	static class InClass {//静态内部类
		public void printInfo() {
			System.out.println("我是有名内部类");
			}
		}
}			

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

public class OutClass {
	private double weight=72;
	public static void print(String name) {
		System.out.println(name);
		}
static class InClass{
	{
	double weight = new OutClass().weight;//由于weight是非静态的,所以在静态内部类中使用时必须先创建外部类对象
	print("Tom");//由于print方法为静态方法,所以可以直接使用。
	}

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

public class OutClass {
public static void main(String[] args) {
	if(args!=null) {
		class InClass{
		}
		}
InClass inClass = new InClass();//无法创建对象,因为内部类作用范围无法作用到这里
	}
}

Run as ——>执行“一次”java命令——>类加载一次——>静态的成员(成员变量、代码块、方法)只被操作操作一次,因为初次类加载的时候只加载代码块,如果有static修饰则只存在内存中,不会进行加载

public static void main(String[] args) {
//public int age=12;
static int age=12;//局部变量不能有static修饰
}

静态成员变量可以"直接"在非晶态方法或代码块中使用,为什么?
静态的在类加载的时候处理:静态变量直接赋值 静态方法直接分配地址 静态代码块直接执行;非静态的只能在创建对象时执行操作:变量
JVM对静态的操作比非晶态的靠前

只有有名静态内部类中才允许有静态成员(静态属性、静态代码块和静态方法)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值