1.System.out.println(variable)为什么会调用重写的toString方法?

根据我搜到的信息结合源代码,得到以下结论,如有误请告知。

首先我们看一下println方法的源代码:

public void println(Object x) {
  String s = String.valueOf(x);
  synchronized (this) {
    print(s);
    newLine();
  }
}

如代码所示,println方法的参数是Object类型,在执行输出操作前会将Object类型通过valueOf方法转化为String类型。

那么,我们再来看valueOf方法的源代码:

public static String valueOf(Object obj) {
  return (obj == null) ? "null" : obj.toString();
}

也就是说println(variable)实际上就是println(variable.toString()),所以会调用我们重写的toString方法。

我们再看看print方法的源代码:

public void print(Object obj) {
  write(String.valueOf(obj));
}

嗯,看起来一样

2.static final和final的区别

static fianl只会被初始化一次,这是因为被static修饰的东西只能初始化一次。

final则是创建对象时初始化,每有一次创建就会初始化一次。

也就是说装载完,static final的值是无法改变的,而final的值是可以改变的,但改变的方法比较特殊,需要初始化。

3.final的部分用法

java是允许空白final的存在(即只声明不赋值),但只能存在于方法中。

final修饰方法的参数时,那么该参数在该方法中只可读取,不可修改。

fianl修饰的的方法无法被重写。

final修饰的类禁止继承(与类里面的方法和变量无关)。

4.类的加载及初始化说明

类的加载发生于创建 类的第一个对象时,但当访问static域或static方法时,也会发生加载。

所有static对象和static代码段都会在加载时依程序顺序而一次初始化话。当然,定义为static的东西只会被初始化一次。

注意:new一个对象时,优先执行static,而父类的static又优先于子类的static。之后执行父类的非static,接着执行父类的构造方法,紧接着执行子类的非static。最后执行子类的构造方法。

5.什么是基类,什么是导出类?

基类就是父类,而导出类就是子类。

6.程序绑定概念

绑定指的是一个方法的调用与方法所在的类(方法的主体)关联起来。

7.java的前期绑定和后期绑定

在程序执行前进行绑定,由编译器或其他连接程序实现,叫前期(静态)绑定。

java当中只有static方法和fianl方法是前期绑定(private方法属于final方法)。

在运行时根据对象的类型进行绑定,叫后期(动态或运行时)绑定。

一种语言实现后期绑定,必须具有某种机制,以便在运行时能判断对象类型,从而调用恰当的方法。

8.向上转型

向上转型的对象调用的方法是子类的。

向上转型的对象调用的变量是父类的。(变量不具备多态性,只有方法产生多态)

但如果调用的方法父类中没有的话则会报错。

父类的引用可以指向子类的对象,但是子类的对象不能指向父类的对象。

9.协变返回类型

协变返回类型指的是在子类中被覆盖的方法可以返回  父类方法的返回类型  的子类。

10.抽象类(abstract关键字)

特点:1.抽象方法中一定在抽象类中,抽象类可以没有抽象方法;2.抽象方法和抽象类必须由abstract修饰;3.抽象类不能用new创建对象,因为没有意义;4.想要调用抽象方法,必须通过子类重写所有的抽象方法,创建子类对象调用。如果只重写部分抽象方法,那么子类还是一个抽象类。

11.接口(interface关键字)

interface关键字可以产生一个完全抽象的类,不提供任何具体实现。它允许创建者确定方法名、参数列表、返回类型,但没有任何方法体。

接口中的注意点:1.接口只能定义抽象方法和常量,抽象方法隐式修饰符为public abstract,常量隐式修饰符为public static final,常量不能是空final,但能被非常量表达式初始化;2.接口必须通过implements引用;3.一个类只能继承一个父类,但可以实现多个接口;4.接口可以继承其他接口,并添加新的属性和抽象方法;5.在类中实现接口中的抽象方法必须加上public修饰符。

12.静态方法和实例方法(非静态方法)的调用

在外部调用静态方法时,可以使用“类名.方法名”,也可以使用“对象名.方法名”。而实例方法只能使用“对象名.方法名”。

静态方法在访问本类成员时,能够直接访问的只有静态成员(静态成员变量和静态方法),其他成员需要创建实例对象才能访问(new)。而实例方法没有限制。

因为静态优先于对象(运行类就会初始化静态方法),所以静态方法中不能出现this,super关键字。

main()主函数就是静态方法

13.Readable接口

Readable接口是专门为Scanner创建的,以使Scanner不必将其参数限定为某个特定类。

在使用过程中,使用Readable接口的类将重写read()方法。并且Scanner.hasNext()将会调用read()方法。这是因为hasNext()里使用了readInput()方法,而readInput()方法里创建了一个Readable类的对象,并调用了read()方法。

14.问题内部类和外部类

等待以后解决

(未完待续)

读《thinking in java》第一遍笔记的更多相关文章

  1. 读《疯狂Java讲义》笔记总结一

    最近在读<疯狂Java讲义>,现把其中遇到的一些自己以前没掌握的点儿记录下来. 1.字符串相关 字符串不是基本类型,字符串是一个类,也就是一个引用类型. 字符串转int类型String a ...

  2. 读《疯狂Java讲义》笔记总结三

    1.初始化块 实际上初始化块是一个假象,使用javac命令编译Java类后,该Java类中的初始化块会消失--初始化块中代码会被 "还原" 到每一个构造器中,且位于构造器全部代码的 ...

  3. java 第一课 笔记

    java是一种解释型语言 Java提供了内存自动管理:不涉及指针:单继承. classpath:字节码文件的路径,执行java.exe时,会查找并解释*.class文件 set classpath=. ...

  4. 读《疯狂Java讲义》笔记总结二

    1.变量分类图 2.通过实例访问静态变量(类变量) 3.静态导入 4.构造器 5.创建对象内存过程

  5. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  6. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  7. Java第一阶段总结

    学习java已经一个多月的时间了,第一阶段总算完成了. 这中间遇到很多问题,通过问同学问学长,收获了很多,但也知道自己和其他同学相差很远.他们java第一阶段只用了不到一个月的时间,而我拖了很长时间, ...

  8. 尚学堂Java第一课

    今天是北京尚学堂郑州分校开课的第一天,小班面授教学. 我很兴奋,是一个小白对IT大神渴求传道授业解惑的兴奋. 杨老师还是一贯耐心详细的手敲了第一堂课的完整大纲,必须给杨老师赞赞赞!!! 从幽默的制定班 ...

  9. 《Thinking In Java》阅读笔记

    <Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...

随机推荐

  1. HDOJ.2501 Tiling_easy version

    Tiling_easy version Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  2. C&C++——C函数与C++函数相互调用问题

    C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语 ...

  3. Angular 监听路由变化

    var app = angular.module('Mywind',['ui.router']) //Angular 监听路由变化 function run($ionicPlatform, $loca ...

  4. HNOI2002 彩票 [搜索]

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  5. 对zip文件进行解压操作和对一个文件进行压缩操作

    注意这里用的是apche下的zip package org.springframework.validation; import org.apache.tools.zip.ZipEntry; impo ...

  6. oracle与mysql与sqlserver的分页

    假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询: 1 SELECT 2 * 3 ...

  7. [05] call by sharing || 共享参数

    转: https://segmentfault.com/a/1190000005177386 众所周知,JavaScript中参数是按值传递的.与访问变量不同,基本类型和引用类型的参数在传递时都如同变 ...

  8. 粉刷匠(bzoj 1296)

    Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...

  9. 【BZOJ2832&&3874】宅男小C [模拟退火][贪心]

    宅男小C Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 众所周知,小C是个宅男,所以他的每 ...

  10. JS形参与实参问题

    JavaScript的参数传递也都是采用值传递的方式进行传值. (1)     通过实参调用函数的时候,传入函数里的是实参的副本而不是实参,因此在函数里面修改参数值并不会对实参造成影响. 例如:将全局 ...