学习Java必知必会的34个核心知识点( 四 )


所以,实际上java和javax没有区别 。这都是一个名字 。
17. 接口和抽象类的区别是什么?

  1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法 。
  2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定 。
  3. 一个类可以实现多个接口,但最多只能实现一个抽象类 。
  4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定 。
  5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 。从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范 。
备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用 。实现类和实现是不可以调用的 。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错 。(详见issue:https://github.com/Snailclimb/JavaGuide/issues/146)
18. 成员变量与局部变量的区别有那些?
  1. 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰 。
  2. 从变量在内存中的存储方式来看:如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用使用static修饰,这个成员变量是属于实例的 。而对象存在于堆内存,局部变量则存在于栈内存 。
  3. 从变量在内存中的生存时间上看:成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失 。
  4. 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值),而局部变量则不会自动赋值 。
19. 创建一个对象用什么运算符?对象实体与对象引用有何不同?new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中) 。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球) 。
20. 什么是方法的返回值?返回值在类的方法里的作用是什么?方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果) 。返回值的作用:接收出结果,使得它可以用于其他的操作!
21. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?主要作用是完成对类对象的初始化工作 。可以执行 。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法 。
22. 构造方法有哪些特性?
  1. 名字与类名相同 。
  2. 没有返回值,但不能用void声明构造函数 。
  3. 生成类的对象时自动执行,无需调用 。
23. 静态方法和实例方法有何不同
  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式 。而实例方法只有后面这种方式 。也就是说,调用静态方法可以无需创建对象 。
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制 。
24. 对象的相等与指向他们的引用相等,两者有什么不同?对象的相等,比的是内存中存放的内容是否相等 。而引用相等,比较的是他们指向的内存地址是否相等 。
25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?帮助子类做初始化工作 。
26. == 与 equals(重要)== : 它的作用是判断两个对象的地址是不是相等 。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) 。
equals() : 它的作用也是判断两个对象是否相等 。但它一般有两种使用情况:
  • 情况1:类没有覆盖 equals() 方法 。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象 。
  • 情况2:类覆盖了 equals() 方法 。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等) 。
举个例子:
public class test1 {
public static void main(String[] args) {


推荐阅读