2015/11/19 由于内部类引起的学习
为了什么写博客-----怕忘 ; 为了什么怕忘 ---怕问了不会 ; 为了什么怕问了不会 ---怕经验少 ;为了什么怕经验少----怕赚钱少;
学习只是为了赚钱 ,所以必须努力。
内部类:今天看见同事写的内部类,我起初的想法就是写这个几把玩意做毛啊,不费事啊,后来想想,算了为了多赚钱还是学习下吧。
以maven启动的测试类为例,内部类其实就相当于一个可以包含方法的方法
好处是啥我也不知道,感觉就是闲的 分开写不好么 ,非写一起,好处以后知道再补充吧。public class RunTest { Logger logger = LoggerFactory.getLogger(RunTest.class); String name="wulei"; public void test111(){ new neibulei("11111").neibutest(); //和neibulei nei=new neibulei("1111"); nei.nebutest();一样,只是多了一个对象的引用 new neibulei().neibutest(); } private class neibulei{ public neibulei(){ name="wangmin"; } public neibulei(String name123){ name=name123; } public void neibutest(){ name="wuleiwangmin"; logger.info("name:{}",name); } } @Test public void test(){ test111(); } }
里面用到内部类,就设计到构造函数什么时候调用,构造函数的作用了。
构造器:与类同名,可以有参数,可以没有(爱有几个有几个),没有返回值(不能写什么void什么玩意的),随着new去调用(所以一般就是个初始化,没人在这个里面进行别的操作,也不是说不能这么做,也许大家就是定个规范,不想这么做吧 )
如果执行的是有参数的构造函数,则默认的无参构造函数不会执行,如果执行的时候new 类().方法() 这个时候先要去执行下无参的构造方法,之后再调用方法。
构造器其实我感觉也没啥用,就是个初始化,spring都自己管理对象了 ,谁知道用这个赋值做毛,以后知道再补充吧,构造器都看了,肯定想到的是那些对象空间的分配,什么对象,什么值存在什么位置上。
内存空间:所有的内存分配,你的先把程序给他编译运行起来啦,不编译谈毛运行(运行需要class文件),不运行谈毛内存分配,在java里面写new,只是写个文字,不编译,不运行不会分配空间
首先内存的区域有大致的几个地方分配------栈,堆,静态变量存储区,代码区
首先思考的三个问题:1.什么变量?存哪?
2.when分空间
3.when释放
栈(对象的引用,局部变量,形参)
堆(new出来的数据,成员变量)
静态变量存储区(静态变量)
代码区(方法,.class)
真不知道知道这玩意有啥用,写错程序不就自己报错了么,为了赚钱还是研究研究吧,下面举个例子
在一个类里面 Person p;(这时栈里面什么也没有)
Person p =newPerson ();(这时程序开始工作啦先看看有没有class,如果没有的话是无法创建对象的)
这个时候首先做的事情不是把对象的引用放在栈里面
现在处于程序的运行阶段jvm的生命周期是存活的(java运行时需要虚拟机,一个jvm的生命周期是指启动到退出的过程,程序的运行按钮从红到灰的这个过程,一个jvm生命周期一个类只加载一次,所以改了java文件,需要重启服务)
1.加载类,把class加载到内存放在代码区,同时把静态变量加载进静态变量存储区
2.创建对象的引用在栈中(存了一个地址)
3.如果 Person p1 =newPerson ();这个时候不用加载class,分配静态变量存储,直接创建对象的引用(一个jvm相同的类只加载一次,静态变量应该也是),同时对这个类里面的成员变量分配空间,存在堆中,因为是new才会分配的,所以是堆不是栈
4.如果Student stu=new Student();这个时候还需要加载Student类,之后加载这个类的静态变量,创建对象的引用
这个时候我感觉最需要思考的一个问题是:tm的一个类什么时候被加载难道只有new么
显然不是,类加载有两种,new,调用静态方法
之后面试的问题来了,静态方法中可以直接使用成员变量和方法不------>答案果断no啊
分析:静态方法(类加载时create),成员变量,方法(new是create),现在尼玛都没有new,而是另一种加载类的方式,何来可以静态方法调用成员变量,方法
当这个类去调用别的类的方法的时候(如果只是new类,没有调用方法是不会对局部变量和形参分配内存的),这个时候就有形参,局部变量的存在了,这个时候内存分配的位置是栈
释放资源:对应静态变量(1个jvm生命周期),所以很少用static,如果只有一次,机器不重启一直处于一个jvm中,不会释放资源
对类的成员变量,在类对象销毁的时候销毁
对形参,局部变量,方法结束回收资源