Java读书笔记之垃圾回收、对象初始化

1、面向对象编程的优点 封装集成多态 实现了高复用性,包括对象的组合和聚合 提高内聚 解耦,使研发者可以动态修改自己类中的值而不影响应用者,可以用对象来直接表示问题空间, 而不像面向过程般需要 直接在脑子建模面向机器的解空间。

2、关于动态绑定实现多态的底层,如果子类无复写,那一般引用的变量为就近原则,即父类子类都定义了变量 而引用优先引用父类的变量。一般变量都可以被初始化,但在局部变量内定义变量时不会初始化的,会直接报错。具体例子如下代码所示。

package Test;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B a = new B();
		System.out.println(a.sum());
		
		C c = new C();
		System.out.println(c.i);
	}

}

class C{
	int i;
	public int getY() {
		int y;
		return y;
	}
}


class A {
	public int i = 10;
	
	public int sum() {
		return i + 10;
	}
	
	public int sum1() {
		return getI() + 10;
	}
	
	public int getI() {
		return i;
	}
}

class B extends A{
	public int i = 20;
	
	public int sum1() {
		return i + 20;
	}
	
//	public int getI() {
//		return i;
//	}
}

3、类中的静态变量是类加载时就加载的,创建这个类多个实例,也只能共享这个静态变量的存储空间,意味着你只能同时修改各个实例中的这个静态变量。
4、注意两个对象和两个值的比较是否相等,Integer设置了缓存,你只要定义在[-128,127]中的Integer类型他都会返回在Cache定义好的对象引用具体代码测试如下:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer i = 34;
		Integer i2 = 34;
		System.out.println(i == i2);
		i = i + 1;
		System.out.println(i);
		System.out.println(i2);
		Integer i3 = 35;
		System.out.println(i == i3);
	}

结果:在这里插入图片描述一般比较两值相等用equal 用==是比较两个是否是同一个对象。可以复写各个类的equal方法。
5、Static静态,一般来说构造方法如不显示的声明他默认就是静态的,静态方法在类加载或者第一次调用时就会把该类的所有静态字段进行初始化并赋值。后续不会再对这些静态的方法进行初始化。
6、概括一下创建对象的过程,假设有个名为 Dog 的类:

 1. 即使没有显式地使用 static 关键字,构造器实际上也是静态方法。所以,当首次创建 Dog 类型的对象或是首次访问 Dog 类的静态方法或属性时,Java 解释器必须在类路径中查找,以定位 Dog.class2. 当加载完 Dog.class 后,有关静态初始化的所有动作都会执行。因此,静态初始化只会在首次加载 Class 对象时初始化一次。
 3. 当用 new Dog() 创建对象时,首先会在堆上为 Dog 对象分配足够的存储空间。
 4. 分配的存储空间首先会被清零,即会将 Dog 对象中的所有基本类型数据设置为默认值(数字会被置为 0,布尔型和字符型也相同),引用被置为 null5. 执行所有出现在字段定义处的初始化动作。
 6. 执行构造器

7、垃圾回收器,首先明确垃圾不一定会被清理,有时候可能要等到内存可用空间很小的时候才会对垃圾进行回收,因为垃圾回收也是需要开销的。finalize()方法用于清理特定难以被清理的垃圾,也可用来辅助发现一些不容易被发现的Bug比如必须确认某个对象必须要将值重置成指定值。这个比较难以理解用代码解释:


class Book {
    boolean checkedOut = false;
    Book(boolean checkOut) {
        checkedOut = checkOut;
    }
    void checkIn() {
        checkedOut = false;
    }
    @Override
    protected void finalize() throws Throwable {
        if (checkedOut) {
            System.out.println("Error: checked out");
        }
        // Normally, you'll also do this:
        // super.finalize(); // Call the base-class version
    }
}
public class TerminationCondition {
    public static void main(String[] args) {
        Book novel = new Book(true);
        // Proper cleanup:
        novel.checkIn();
        // Drop the reference, forget to clean up:
        new Book(true);
        // Force garbage collection & finalization:
        System.gc();
        new Nap(1); // One second delay
    }
}

确认图书必须被归还
8、垃圾回收器的工作,与C\C++不同的是Java给对象分配空间时像是个传送带,直接往前塞他就一定时空的可以放下的,这样大大提升了速度,但是当垃圾对象被清理掉那些传送带上的空间就会出现间距,所以垃圾回收时垃圾回收器会将内存中的对象进行从新排序,让他变得更紧凑。垃圾回收器机制有多种:
计数法:活对象+1,抛弃-1 最后扫描所有对象列表进行清理(开销太大,有些小垃圾不需要清晰,且解决不了对象循环引用的情况)
Java采用自适应的垃圾回收技术:使用停止-复制、标记-清理相结合,标记活对象进行复制。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值