2018-09-22构造方法、垃圾回收机制、this、static

1.构造器使用要点:

    1.通过new关键字调用!!

    2.构造器虽然有返回值(返回该类的对象),但是不能定义返回类型 (返回值的类型肯定是本类),不能在构造器里调用return。

    3.如果我们没有定义构造器,则系统会自动定义一个无参的构造函数。如果已定义则编译器不会添加!

    4.构造器的方法名必须和类名一致!

1.1.构造方法的重载和普通方法一样:

 

      普通方法重载的条件:

      1.不同的含义:形参类型、形参个数、形参顺序不同

      2.只有返回值不同不构成方法的重载

      如:

        int a(String str){}与 void a(String str){}

      不构成方法重载

      3.只有形参的名称不同,不构成方法的重载

      如:

        int a(String str){}与int a(String s){}

2.垃圾回收机制:

Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。


2.1垃圾回收原理和算法:

·内存管理

  Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。

  对象空间的分配:使用new关键字创建对象即可

  对象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有”不可达”对象的内存空间。

·垃圾回收过程(2个要点)

  任何一种垃圾回收算法一般要做两件基本事情:

  1. 发现无用的对象

  2. 回收无用对象占用的内存空间。

  垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量引用该对象。Java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

·垃圾回收相关算法

  1. 引用计数法

  堆中每个对象都有一个引用计数。被引用一次,计数加1. 被引用变量值变为null,则计数减1,直到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法别识别。

【示例4-7】循环引用示例

public class Student {

    String name;

    Student friend;//在一个对象中又引用了另一个对象


    public static void main(String[] args) {

        Student s1 = new Student();

        Student s2 = new Student();


        s1.friend = s2;

        s2.friend = s1;        

        s1 = null;

        s2 = null;

    }

}

  s1和s2互相引用对方,导致他们引用计数不为0,但是实际已经无用,但无法被识别。

  2. 引用可达法(根搜索算法)

  程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。

2.2通用的分代垃圾回收机制:

        分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。

    (上面的英文翻译Eden:伊甸园;Survivor :幸存者;Tenured/Old:终身制/ 古老)

1. 年轻代

  所有新生成的对象首先都是放在Eden区。 年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象,对应的是Minor GC,每次 Minor GC 会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代”区域存放满对象后,就将对象存放到年老代区域。

  2. 年老代

  在年轻代中经历了N(默认15)次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。年老代对象越来越多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。

  3. 持久代(不讨论)

  用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。

.垃圾回收过程:

1、新创建的对象,绝大多数都会存储在Eden中,

    2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,【触发gc就是上一段的一些垃圾回收的算法:引用可达法、引用可达法】

           然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区

    3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,

          同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。

4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,

    5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)


·Minor GC:

用于清理年轻代区域。Eden区满了就会触发一次Minor GC。清理无用对象,将有用对象复制到“Survivor1”、“Survivor2”区中(这两个区,大小空间也相同,同一时刻Survivor1和Survivor2只有一个在用,一个为空)

  ·Major GC:

  用于清理老年代区域。

  ·Full GC:

  用于清理年轻代、年老代区域。 成本较高,会对系统性能产生影响。

2.3 JVM调优和Full GC

.在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

  1.年老代(Tenured)被写满

  2.持久代(Perm)被写满

  3.System.gc()被显式调用(程序建议GC启动,不是调用GC)

  4.上一次GC之后Heap的各域分配策略动态变化

3.this

· 对象创建的过程和this的本质

  构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步:

  1. 分配对象空间,并将对象成员变量初始化为0或空

  2. 执行属性值的显式初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

this最常的用法:

  1.  在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。

  2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。

  3. this不能用于static方法中。

 TestThis(int a, int b){

    this.a=a;

    this.b=b;

}

TestThis(int a, int b, int c) {

        this(a, b); // 调用带参的构造方法,并且必须位于第一行!

        this.c = c;

    }


this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建。因此,在构造方法中也可以使用this代表“当前对象” 

4.static 关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:

  1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。

  2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!

  3. 一般用“类名.类属性/方法”来调用。(也可以通过对象引用或类名(不需要实例化)访问静态成员。)

  4. 在static方法中不可直接访问非static的成员。

核心要点:

         static修饰的成员变量和方法,从属于类。

         普通变量和方法从属于对象的。

public class User2 {

    int id; // id

    String name; // 账户名

    String pwd; // 密码

   static String company = "北京尚学堂"; // 公司名称

    public User2(int id, String name) {

        this.id = id;

        this.name = name;

    }

    public void login() {

        printCompany();//非静态可以调用静态的(因为类信息是先加载的java User2 就会去加载类信息,而没new的时候是不会去创建对象的,所以静态方法里不能调用非静态信息。 )

        System.out.println(company); 

        System.out.println("登录:" + name);

    }


    public static void printCompany() {

//         login();//调用非静态成员,编译就会报错

        System.out.println(company);

    }


    public static void main(String[] args) {

        User2 u = new User2(101, "高小七");

        User2.printCompany();

        User2.company = "北京阿里爷爷";

        User2.printCompany();

    }

}

下面内存图片解释为什么在静态方法中不能调用非静态方法:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容