Think in java书籍阅读小结

一、博客说明

本篇博客为本人看完think in java这本书后,个人查漏补缺的一些知识点,记录下来作为笔记使用

二、变量初始化顺序

     在一个类里,变量初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的后面,
那些变量仍会在调用任何方法之前得到初始化——甚至在构建器调用之前。

public class A{
    A(){
         str = “abc”;
    }
    String str = “a”;
    
}

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
可查看:https://blog.csdn.net/xyajia/article/details/80922329

三、private修改默认构造器 

      由于默认构建器是唯一获得定义的,而且它的属性是 private,所以可防止对这个类的继承,也可以防止别人通过 new 类名()得到类对象。

四、衍生类继承基础类时 

     若基础类的构造器进行了修改,衍生类继承基础类时,必须要在衍生类的构造器中通过super()调用基础类的构造器,否则会报错。
    这是因为创建衍生类的一个对象时,它在其中包含了基础类的一个“子对象”。这个子对象就象我们根据基础类本身创建了它的一个对象。从外部看,基础类的子对象已封装到衍生类的对象里了。

public class Car {
    public Car(String car){
    }
}

public class Redcar extends Car {
    public Redcar(String car) {
        super(car);
    }
}

五、继承的类对象可向上塑性

public class Car {
    static void getCar(Car car){
    }
}

public class Redcar extends Car {

    public static void main(String[] args) {
        Redcar rcar = new Redcar();
        Car.getCar(rcar);
    }
}

    代码里getCar()方法,它能接受一个 Car句柄。但在 Redcar.main()中,getCar()方法是通过为其赋予一个Redcar 句柄来调用的。由于Java 对类型检查特别严格,所以大家可能会感到很奇怪,为什么接收一种类型的方法也能接收另一种类型呢?

  我们一定要认识到一个Redcar 对象也是一个Car对象。在getCar()中,代码适用于 Car以及从 Car衍生出来的任何东西。在这里,我们将从一个Redcar 句柄转换成一个Car 句柄的行为叫作“上溯造型”。

六、什么是多态

    多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

七、如何实现多态

    Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

Shape s = new Circle();
s.draw();

在这里,我们创建了Circle 对象,并将结果句柄立即赋给一个Shape。Circle是子类属于Shape父类 的一种。
当我们调用其中一个基础类方法时(已在衍生类里覆盖):s.draw();
同样地,大家也许认为会调用Shape 的 draw(),因为这毕竟是一个 Shape句柄。那么编译器怎样才能知道该
做其他任何事情呢?但此时实际调用的是Circle.draw(),因为后期绑定已经介入(多态)

八、Java重写(覆盖)、重载、过载

重写,也称为覆盖,是指派生类重写了基础类的方法。
重载,指一个类里面的方法名相同但是参数列表不同。
过载,指在一个类中拥有多个同名但参数列表不同的方法,这样编译器就可以根据不同的参数来调用不同的方法实现过载

九、java类只允许继承一个类,但可以实现多个接口

java可以通过继承扩展接口,利用继承技术,可方便地为一个接口添加新的方法声明,也可以将几个接口合并成一个新接口

interface Monster {
	void menace();
}
interface DangerousMonster extends Monster {
	void destroy();
}

class DragonZilla implements DangerousMonster {
	public void menace() {}
	public void destroy() {}
}

interface Lethal {
	void kill();
}
interface Vampire extends DangerousMonster, Lethal {
    void drinkBlood();
}

最后Vampire接口包含了menace(),destroy(),kill(),drinkBlood()方法

十、接口和抽象类的选择

    如果事先知道某种东西会成为基础类,那么第一个选择就是把它变成一个接口。只有在必须使用方法定义或者成员变量的时候,才应考虑采用抽象类。所以就是优先选择接口。

十一、基本类型数组和对象数组的区别

无论使用的数组属于什么类型,数组标识符实际都是指向真实对象的一个句柄。
对象数组和基本数据类型数组在使用方法上几乎是完全一致的。
唯一的差别在于对象数组容纳的是句柄,而基本数据类型数组容纳的是具体的数值

十二、对象序列化

    对象的序列化是非常有趣的,因为利用它可以实现“有限持久化”。请记住“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。
通过序列化一个对象,将其写入磁盘,以后在程序重新调用时重新恢复那个对象,就能圆满实现一种“持久”效果。之所以称其为“有限”,是因为不能用某种“persistent”(持久)关键字简单地地定义一个对象,并让系统自动照看其他所有细节问题(尽管将来可能成为现实)。相反,必须在自己的程序中明确地序列化和组装对象。

十三、RTTI:运行时类型识别

一般通过类反射来实现

十四、java 深浅克隆

https://blog.csdn.net/lovezhaohaimig/article/details/80372233

十五、进程,线程的区别

    我们生活中有许许多多关于进程与线程的小栗子,比如:1.我们使用打开一个微信软件,这个时候就开启了一个进程,
当我们在微信里面进行各种操作(查看朋友圈,扫一扫...),这么多的操作就是线程。所以我们可以说“进程”是包含“线程”的,“线程”是“进程”的一个子集。

      进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

     线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值