Java

java复习 易错知识点

类和对象

  1. 类的修饰符只能是public,abstract和final(表示该类没有子类),而不可以用private和protected,当然了,也可以没有修饰符,那么此时该类只能在自己所处的包内访问,在包内与public无异

  2. 类中字段(属性)的修饰符可以是public, private,protected或者缺省。如果是缺省,那么在包内,与public无异,在包外则无论如何不可以访问。如果是protected,则比缺省多了一种情况就是不在同一个包的子类也可以访问protected修饰的属性。而private则只能在该类中访问。

  3. final修饰符修饰的属性称之为常量,即只能赋值一次,一旦被赋值,就不能被改变,由final修饰的变量,除了可以在被声明的时候赋值之外,还可以通过构造器进行赋值,但是这种情况要保证一定会通过构造器被赋值,比如说你如果你自己定义了一个构造器没有对它进行赋值,就会报错。下面的这段代码就是错误的。

    public class City{
      public final String name;
      public City(){}
      public City(String str){
          name = str;
      }
    }

     

  4. 每一个类至少有一个构造器,如果没有自己定义,会自动提供一个缺省构造器,但如果你自己写了带参数的构造器,那么之前默认的缺省构造器就会自动丧失。

  5. static初始化块在类加载时执行,且只执行一次。而普通的非静态初始化块则在每次创建对象时,在执行构造器之前执行一次。

  6. static初始化块只能对静态属性进行初始化或执行其他操作,但绝对不能使用类中的方法或者对实例字段进行操作。而非静态初始化块则没有这个限制,它也可以对静态属性进行操作。

    public class City{
      public static int val;
      public int x;
      static {
          val = 0;
          // x = 0; 错误
          // get();   错误
      }
      {
          val = 0;
          x = 0;
          get();
      }
      public void get(){
          System.out.println("666");
      }
    }

     

  7. static初始化块中不能使用 this.  ,也就是说一旦你在static初始化块中定义了一个局部变量,与类中的某个静态成员同名,那么你在static初始化块中,就没有办法再访问那个静态成员。

  8. 有下面几种情况会触发类的静态初始化,需要引起注意 访问类的静态变量和静态方法     反射如(Class.forName())     初始化一个类发现其父类还没有初始化     虚拟机刚启动定义了main方法的那个类中的静态初始化块              但是需要注意的是,以上的几种情况会触发静态初始化需要一个前提就是:该类还从未被静态初始化过,否则的话就不会再一次触发静态初始化

  9. 静态方法属于定义它的类,而不属于该类的实例。可以通过类名调用,也可以通过实例调用,甚至可以通过子类的类名和实例调用()。

  10. 静态方法只能调用静态成员。如果要访问非静态成员,只能通过在静态方法中定义的实例来访问。静态方法中不允许this和super引用。

  11. 静态方法不能在子类中被改写为非静态的,也不允许在子类中改写为返回值不兼容的方法。静态方法中只可以调用本类的静态方法,不能调用非静态的方法。

  12. 方法重载返回类型可以相同可以不相同,但是形参列表必须不同。

  13. 方法的可变参数,“...”位于变量类型和变量名之间,并且最多只能定义一个可变参数。

  14. 每一个包装类都有一个parseType()的方法,来将字符串转换为对应的基本类型。   type c = WrapperClass.parseType("...");

  15. Integer a,b    一般地来说 a == b比较的是是否为同一个引用,但是由于Integer默认在-128到127有缓存,所以在这个区间内使用 == 比较的是值。但如果a, b已经被赋值为对某个对象的引用,即使值在-128到127之间,比较的还是为是否为同一引用。

    public class Main {
       public static void main(String[] args){
           Integer a = 15;
           Integer b = 15;
           System.out.println(a == b);     //True

           a = new Integer(100);
           b = new Integer(100);
           System.out.println(a == b);     //False

           a = Integer.valueOf(100);
           b = Integer.valueOf(100);
           System.out.println(a == b);     //True

           a = 200;
           b = 200;
           System.out.println(a == b);     //False
      }

    }

 

 

类的扩展和继承

 

 

 

posted @ 2019-12-11 11:30  dongdong222  阅读(90)  评论(0编辑  收藏  举报