内存分析,内部类

本文深入探讨Java中内存分配的三个区域:栈、堆和方法区,详细讲解了基本数据类型与引用数据类型的传值区别,展示了对象数组的创建与使用,并介绍了四种内部类的特性和应用场景。

在这里插入图片描述
在这里插入图片描述
1.Java中内存的分配
(1)栈:存放局部变量(方法参数或者方法定义的变量)
(2)堆:存放new出来的对象
(3)方法区:字节码文件,静态变量,静态方法,常量

2.数据类型分类:
基本数据类型:int,byte,short,long,double,float,boolean,char
引用数据类型:String,数组,类

3.基本数据类型传值:(值传递,方法的参数是基本数据类型),在方法中交换值,交换完后原来的值不变;

public static void main(String[] args) {
		int num1=8;
		int num2=10;
		System.out.println("num1="+num1+",num2="+num2);//8,10
		
		StudentManager sm=new StudentManager();
		sm.changeNum(num1, num2);
		System.out.println("num1="+num1+",num2="+num2);//8,10
	}

引用数据类型传值:(引用传递,方法的参数是引用数据类型),在方法中交换值,交换完后原来的值改变;

public static void main(String[] args) {
		Student s1=new Student();
		s1.setName("张三");
		s1.setAge(10);
		System.out.println("没执行方法前,学生姓名:"+s1.getName()+",年龄:"+s1.getAge());
		
		StudentManager sm=new StudentManager();
		sm.changeStu(s1);
		System.out.println("执行方法后,学生姓名:"+s1.getName()+",年龄:"+s1.getAge());
		System.out.println(s1);

	}

4.对象数组:由数据类型相同的对象组成。数组中的每一个元素是一个对象。
//对象数组的声明

 Student[] stus=new Student[3];
    	
    	//给对象数组赋值
    	stus[0]=new Student();//因为数组中的每个元素是对象,对象就要先创建出来,才能使用
    	stus[0].setName("aa");
    	stus[0].setAge(18);
    	
	stus[1]=new Student();
	stus[1].setName("bb");
	stus[1].setAge(88);
	
	stus[2]=new Student();
	stus[2].setName("cc");
	stus[2].setAge(28);
	
	//输出数组中的值
	System.out.println("姓名\t年龄");
	for (Student stu : stus) {
		System.out.println(stu.getName()+"\t"+stu.getAge());
	}

5.内部类:在一个类的里面,再声明一个类。
成员内部类的访问修饰符跟成员变量是一样的,可以是默认,private,protected,public
(1)实例内部类:在一个类的里面,声明成员的内部类。
//创建一个实例内部类的对象
Outer.Inner inner1=new Outer().new Inner();

	 Outer out1=new Outer();
	Outer.Inner inner1=out1.new Inner();

	a.在实例内部类中可以调用外部类中的成员变量(包括静态的成员变量和常量)。
	b.在实例内部类的实例方法中可以调用外部类的实例方法和静态方法。
	c.在外部类和实例内部类中的变量如果同名,内部类中的变量优先级更高。
	d.在内部类中,调用内部类的成员变量:  this.变量名
		在内部类中,调用外部类的成员变量:外部类的类名.this.变量名。

(2)静态内部类:在一个类的里面,声明成员的静态的内部类。
	//创建一个静态内部类的对象
	Outer.Inner inner2=new Outer.Inner();	

	a.在静态内部类中不可以调用外部类中的实例变量和实例方法。	
	b.在静态内部类中,调用外部类的静态变量:外部类的类名.变量名。

(3)局部内部类:在一类的方法里面,再声明一个内部类。
	a.局部内部类不能采用访问控制修饰符(private,protected,public,static)来修饰。
	b.局部内部类仅在声明那个方法中有效。
(4)匿名内部类:在一个类的里面,再声明一个没有名字的类。相当接口多态性。
	a.匿名内部类的语法
	/**
  • 接口,用来匿名内部类的使用
  • @author sx

*/
public interface NiMing {
public void show();
}

/**

  • 研究匿名内部类的使用
  • 外部类
  • @author

*/

public class Outer {
  /**
	 * 匿名内部类,NiMing是用父接口作为类型,
	 * 匿名内部类的唯一的实例对象,
	 *  new NiMing()只是保证结构完整性
	 *  {}这部分是匿名内部类中的主要代码
	 */
	NiMing nm=new NiMing() {
		@Override
		public void show() {
			// TODO Auto-generated method stu
		}
	};
}
	
b.匿名内部类的使用场景:
	该类只需要创建一次对象且该对象只使用一次,则不需要去创建该类,建议采用匿名内部类的方式,减少类的个数。

c.一个匿名内部类,只有一个对象实例。

6.一个类对应一个.class字节码文件。无论你这个类是内部类,还是普通类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值