构造器、垃圾回收机制、this、static关键字

构造器即构造方法,用于对象的初始化。

  1. 通过new关键字调用!

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

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

  4. 构造器的方法名必须和类名一致!
    构造方法的重载(创建不同对象),使用与普通方法重载一致。
    public class User {
    int id; // id
    String name; // 账户名
    String pwd; // 密码
    public User() {

    }
    public User(int id, String name) {
    super(); //构造方法的第一步总是super(),不显式写出,运行时也会自动添加
    this.id = id; //this表示创建好的对象
    this.name = name;
    }
    public User(int id, String name, String pwd) {
    this.id = id;
    this.name = name;
    this.pwd = pwd;
    }
    public static void main(String[] args) {
    User u1 = new User();
    User u2 = new User(101, “高小七”);
    User u3 = new User(100, “高淇”, “123456”);
    }
    }
    垃圾回收机制:
    C++无垃圾回收机制。
    Java垃圾回收过程:发现无用对象;回收无用对象占用的内存空间。
    无用对象指没有任何变量引用该对象。
    垃圾回收相关算法:

  5. 引用计数法
    堆中每个对象都有一个引用计数,被引用一次,计数加1,被引用变量值为null,计数减1,若减到0,则表示为无用对象。该算法无法识别循环引用的无用对象。

  6. 引用可达法(根搜索算法)
    程序把所有引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到该节点后,继续寻找引用节点,当所有节点寻找完毕后,剩余节点则为无用节点。
    通用分代垃圾回收机制:
    对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为Eden、Survivor和Tenured/Old空间。

在这里插入图片描述
垃圾回收过程:
1、 新创建的对象,绝大多数都会存储在Eden中,
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,
然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,
同时将Eden区中的不能清空的对象,也复制到S2,保证Eden和S1,均被清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)
JVM调优主要是对FULL GC的调节,以下情况可能导致FULL GC:
  1.年老代(Tenured)被写满
  2.持久代(Perm)被写满
  3.System.gc()被显式调用(程序建议GC启动,不是调用GC)
  4.上一次GC之后Heap的各域分配策略动态变化
对象创建的过程和this关键字:
this代表当前方法所在的对象。
创建一个对象:

  1. 分配对象空间,并进行对象成员变量初始化,初始化为0或空;
  2. 执行属性的显式初始化;
  3. 执行构造方法;
  4. 返回对象的地址给相关变量。
    this的本质是“创建好的对象的地址”。在构造方法调用前,对象已经创建。因此构造方法中也可以使用this代表当前对象。
    this最常的用法:
  5. 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
  6. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
  7. this不能用于static方法中。static方法存于方法区,方法区也存有类信息,而无对象信息,调用this无法找到当前对象。
    static关键字:
    在类中,static声明的成员方法为静态成员变量,也称类变量,生命周期与类相同,在整个程序执行期间都有效。
    static修饰的成员方法从属于类,普通成员方法从属于对象。
    静态方法中可以使用静态变量和静态方法,普通方法中不能使用静态变量、调用静态方法。
    静态初始化块:构造方法用于对象的初始化!静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
    静态初始化块执行顺序:
      1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
      2. 构造方法执行顺序和上面顺序一样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值