Java SE 11 Sliver学习笔记(第六章)

Java SE 11 sliver资格考试相关

第六章 インスタンスとメソッド

間違えた:3, 5, 18, 19, 20, 21, 22, 23, 24, 27, 30

間違えし易い:

分からない:

回顾
  1. 在Java中,变量有两种类型,一种是原始类型(プリミティブ型),一种是引用类型。引用型只能有两种(1.保存了向对象的参照link。2.没有保存向对象的参照link)因此像object类型可以代入null,但是打印时打印的是null而不是NULL,更不能把NULL直接代入给object类型的变量。还需要注意文字数为0的空string可以代入给object类型的变量,但是并不等于null,因为null相当于什么也没有指向。

  2. JVM的garbage collector(垃圾回收机制)相关的问题。垃圾回收的时机只能由JVM决定。

    对于Java对象来讲,如果说这个对象没有被其他对象所引用该对象就是无用的,此对象就被称为垃圾,其占用的内存也就要被销毁。例如,将null代入给变量的时候,没有被参照的instance就会被销毁。例如:

    1
    2
    Object obj = new Object();
    obj = null; //在这时,原来生成的instace会没有任何参照

    其他还有,把变量代入新的instance的参照时,旧的instance就会变成没有参照的对象,例如:

    1
    2
    Object obj = new Object();
    obj = new Object(); //在这时,obj对instance的参照会被overwrite

    疑问:第四行的b也被赋予了null,原来b所指向的instance是否也是垃圾回收的对象???

  3. Java的Static areaHeap area的问题。在读入class时使用的两种内存领域。static修饰的变量和方法放在static领域中,因此不需要创造instance也可以直接使用。当对一个class中的static变量进行值的变更时,会直接影响到那个class的static变量的值。

  4. static修饰的方法,只能访问static修饰的变量或者方法。

  5. 返回值接收时只能是同一类型或者是有互换性的值。

  6. 可变长参数的问题。使用可变长参数时必须遵循两个原则:

    1. 对于可变长参数。必须要是相同类型的集合,因为JVM传参时会把他们以数组的形式传进去。
    2. 当参数除了可变长参数之外还有其他参数时,可变长参数一定要放到参数的最后!!
  7. overload的定义。必须要是参数的数量,类型,顺序不同,且返回值类型相同的同名方法才算是overload。

  8. 当有两个同名函数,且参数的数量相同时,如果代入函数的参数有暧昧的性质时,JVM因为不知道应该选择哪个函数执行会出现编译错误。

  9. 只有访问修饰词不同的两个函数不能算overload(public string test(){}private string test(){}就不能算重载)。

  10. 构造方法也是方法的一种,因此可以对构造方法进行重载。构造方法的三个rule为:

    1. 构造方法必须与类名同名。
    2. 不能有返回值类型
    3. 只能与new关键字同时使用。因此,构造方法的访问关键字没有要求,即使是private也是可以的。例如可以在类中定义一个static的方法,在方法中调用private的构造方法并返回。有时,还会存在一个类有两个访问权限不同,参数不同的构造方法同时存在,可以由外部调用公开的构造方法,再在公开的构造方法中对私有的构造方法进行调用,达到保护内部信息的目的。
  11. 判断函数是不是构造方法时看有没有写返回值类型(尤其是void!!)。

  12. 构造代码块的问题。构造代码块和构造函数同时出现时,要记住构造代码块一定在所有的构造函数之前被执行。

  13. static的变量是在instance生成之后才能被初始化的,因此在构造代码块和构造函数中无法对它的值进行初期化。如果想在instance生成前对static的类变量进行初始化处理,可以使用static的构造代码块。例如下面的例子,在instance生成前num的值就是10了。

    1. 1
      2
      3
      4
      5
      6
      7
      8
      9
      public class Sample{
      static int num;
      static{
      num = 10;
      }
      public Sample(){
      num = 100;
      }
      }
  14. 当类中有自己定义的有参数的构造方法时,无参的构造方法就不会被自动引入。(判断同名的方法是不是构造方法是关键!!)

  15. 当一个构造函数中想使用同一个类的其他构造函数时要使用this(另外构造函数的参数)

  16. 24问题的后续,在一个构造方法中使用this叫另外的构造方法时,必须在最开始使用,如果在这个this前有别的处理,编译时候会报错.例如这样就会报错。

    public class This {

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public class This {

    public This() {
    this(null, 0);
    this(0, null);
    }

    public This(String str, int num){
    System.out.println("ok");
    }

    public This(int num, String str){
    System.out.println("not ok");
    }
    }
  17. 关于访问修饰词权限的问题,参考这里

  18. 关于访问修饰词权限的问题,参考这里

  19. 因为要防止其他的类对自己的变量进行出乎自己意料的更改,所以需要将变量private,方法public,又名胶囊化。

  20. 当函数的参数是原始类型(プリミティブ型)时,函数被呼出时,参数是从呼出的地方被拷贝到函数本身去的。不会对传入的instance造成影响。

  21. 当函数的参数是object类型时,函数被呼出时,被拷贝的是指向instance的link。因此可能会对原本的instance产生影响。因此,函数的参数是原始类型(プリミティブ型)还是参照类型,非常关键!!!!!

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2021 Joe
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信