zoukankan      html  css  js  c++  java
  • 读《thinking in java》第一遍笔记

    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.问题内部类和外部类

    等待以后解决

    (未完待续)

  • 相关阅读:
    动态横向(水平)合并Repeater数据行DataItem的列
    动态绑数据(Repeater控件HeaderTemplate和ItemTemplate)
    动态横向(水平)合并GridView数据行DataRow的列
    动态绑数据(GridView控件Header和ItemTemplate)
    用具体列名替代星号
    如何实现数据行转换列显示
    用LINQ获取XML节点数据
    从字符串中获取XML节点数据
    字符串创建XML文档
    根据Attribute值条件对XML文档进行修改
  • 原文地址:https://www.cnblogs.com/diantong/p/5992399.html
Copyright © 2011-2022 走看看