Java笔试选择题要点总结

1.初始化顺序错误处理 

 

  • 错误处理 初始化父类中的静态成员变量和静态代码块 ; 
  •  初始化子类中的静态成员变量和静态代码块 ; 
  • 初始化父类的普通成员变量和代码块(每次new都执行),再执行父类的构造方法(每次new都执行);
  • 初始化子类的普通成员变量和代码块(每次new都执行),再执行子类的构造方法(每次new都执行);

2.重写原则(两同两小一大)

  • 方法名相同,参数列表相同
  • 返回类型兼容(小于),抛出异常兼容(小于)
  • 访问权限只能放大不能缩小

3.重载原则:参数类型、参数顺序、参数个数等导致参数列表不同,仅权限、返回类型不同,属于编译错误

4.拆箱装箱

  • 仅在基本数据类型与包装类对象(无论new来的还是装箱来的)比较时发生拆箱
  • 特殊的,两个由装箱而来的Integer对象(不包括Float、Double),-128-127之间时,如Integer a=1; Integer b = Integer.valueOf(1);在比较时也会发生拆箱

5.基本数据类型转换顺序

(byte,short,char)-> int ->long -> float -> double 

包装类的默认值为null,只有成员变量会有默认值,局部变量未赋值就使用属于编译错误

6.Java内存分区

  • 堆区:只存放类对象,线程共享。PS:数组不是原生类(基本数据类型),但它是对象,也存放在堆;
  • 方法区:又叫静态存储区,存放class文件和静态数据(常量池),线程共享;
  • 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享。PS:栈区不需要垃圾回收,运行完即释放 

7.常量池

  • String s = new String("abc"); //该语句创建了两个对象,常量池pool中一个,堆heap中一个。

  • String a = "ab"; String b= "a"+"b"; String c = "ab"; //编译后,a,b,c同指向常量池中的一个对象

8.静态static

  • 静态方法中无法直接访问任何依赖于对象的方法和属性,需要new对象
  • 只有内部类可以被static修饰,静态内部类完全可以看做一个外部类,不能访问外部类的私有成员变量
  • 外部类只能被public、abstract、final关键字修饰

9.抽象abstract

  • 接口的方法默认是public abstract的,变量(其实应该叫常量)默认是public static final,加权限控制符等于白加,一旦权限缩小,属于编译错误
  • 接口可以有自己的default方法和static方法,Java8的新特性,所以接口只能有抽象方法是需要讨论的
  • 抽象类自由度很高,可以没有抽象方法,可以加各种访问权限,可以有正常的成员函数
  • 抽象类和接口都不能被实例化
  • 抽象类和接口除了用于继承或实现之外,一个重要的用途是用于声明,实现动态绑定
  • 抽象方法不能有方法体,有抽象方法的类必须定义为抽象类,子类没有实现基类的抽象方法时也必须被定义为抽象类
  • 抽象方法不能被private、static、syschronized、native等修饰
  • 抽象abstract与常量final关键字永远不兼容

10.常量final

  • final修饰变量,表示这是一个常量,只能被赋值一次,如果是一个成员常量,那么只能在构造函数或声明时或初始化块中赋值,否则属于编译错误
  • final修饰方法,表示这是一个不能被重写的方法
  • final修饰类,表示这是一个不需要被继承的类,觉见的final类如下:
    包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void
    
    字符串类:String,StringBuilder,StringBuffer
    
    系统类:Class,System,RuntimePermission,Compiler
    
    数学类:Math,StrictMath
    
  • final修饰引用,表示这是一个不能被转向的引用,但可以改对象的内容,如集合

11.权限private、protected、public、什么也不标

   类内部  package内  子类  其他
 public  允许  允许  允许  允许
 protected  允许  允许  允许  
 什么也不标  允许  允许    
 private  允许      

12.第一句规律

  • this()和super()调用自己或基类的无参或有参构造函数,必须在本构造函数的第一句
  • package 语句如果有的话,必须在文件的第一句

13.线程

 

  • Vector、Stack、StringBuffer、HashTable、Enumeration是线程安全的
  • 线程可以通过继承Thread类,实现Runnable接口,Callable,线程池等途径创建
  • start是启动子线程的唯一方法,调用run方法只能在本线程中顺序执行
    new Thread(new MyRunnable()).start() //实现Runnable接口的启动
    new Thread().start() //继承Thread类的启动
  • obj.wait() 或obj.notify()或obj.notifyAll()的obj必须与synchronized(X)中的X相同
  • notify也只是在退出临界区之后,释放对象锁,不是立即释放
  • 常用的同步器:CountDownLatch、Semaphore,不常用的:Barrier(如CyclicBarrier)、Exchanger
  • ThreadLocal用于线程间的数据隔离,采用哈希表的方式来为每个线程都提供一个变量的副本,保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
  • Condition.await/signal/signalAll是Java1.5后更高效的线程协作工具

14.异常处理

  • try,catch,finally原则上顺序执行
  • catch只有在try块抛出异常后才执行,且异常被成功捕获后,只要没有return语句,System.exit(0)等,程序按顺序执行,不会跳出
  • catch可以没有,也可以有多个。没有的情况下,需要throws声明未处理的异常有哪些。多个的情况下,从小到大捕获比较合理。
  • finally总是会执行,区别于对象的finalize方法。try块或catch块中有return语句时,会先缓存return结果,去执行finally块,但finally块不能影响原本要return的结果。
    try块中throw异常,未在当前方法catch时(throws情况),会先执行finally方法,然后才执行catch块。
  • Thread.sleep()、obj.wait()均必须catch捕获InterruptException异常,否则属于编译错误

15.集合类

下图中,实框为类,短线框为抽象类,点框为接口

16.关键字、保留字

  • 标识符由$、_、数字、字母组成,不能以数字开头,不能是关键字和保留字
  • 关键字分类列表如下:
 访问控制  private 私有的 protected 受保护的 public 公共的
 类、方法和变量修饰符  abstract 声明抽象   class 类  extends 扩允,继承    final终极,不可改变的 implements实现   interface 接口   native 本地   new 新,创建 static 静态    strictfp 严格,精准  synchronized 线程,同步    transient 短暂 volatile 易失
 程序控制语句  break 跳出循环    continue 继续   return 返回   do 运行   while循环  if 如果  else 反之   for 循环   instanceof 实例    switch 开关    case 返回开关里的结果   default 默认 assert 断言 enum枚举
 错误处理  catch 处理异常      finally 有没有异常都执行     throw 抛出一个异常对象throws 声明一个异常可能被抛出      try 捕获异常
 包相关  import 引入    package 包
 基本类型  boolean 布尔型   byte 字节型   char 字符型   double 双精度    float 浮点int 整型   long 长整型    short 短整型 
 变量引用   super 父类.超类   this 本类    void 无返回值
  • 保留字列表:byValue, cast, false, future, generic, inner, operator, outer, rest, true, var , goto ,const,null

17.switch

 

 

  • 块如果不及时break的话,会无视case是否满足而顺序执行
  • switch只能作用于char、byte、short、int以及它们的包装类、String、enum,作用于boolean、long、float、double属于编译错误

18.继承extends、多态

  • 子类会继承父类的所有成员方法和属性,只是私有属性和方法不可访问而已
  • 静态方法无法实现多态,只能被隐藏,引用是谁的就调用谁的函数
  • 属性(类变量或实例变量)无法实现多态,只能被隐藏,引用是谁的就调用谁的属性
  • instanceof 方法是接受多态的
  • 类只能继承一个基类,可以实现多个接口;接口可以继承或扩展多个接口
  • 泛型不接受多态,但是有相应的范围表示法来应对多态, 代表小于等于A的范围,代表大于等于A的范围,代表全部范围

    小范围可以赋值给大范围,点可以赋值给所在的某个范围

  • 按照运行时多态,基类构造函数中调用的被覆盖函数,已经在使用子类的重写函数,但此时子类未执行任何初始化块,更没有执行构造函数,所以重写函数中获取到的任何成员变量值为默认值,任何成员对象为null;

19.构造函数

  • 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
  • 构造方法不是类的成员方法,不能被子类继承
  • 自定义带参的构造函数会导致系统不给默认无参构造函数

猜你喜欢

转载自blog.csdn.net/Zuostar/article/details/77278324