【码农每日一题】Java 普通类与方法相关面试题

88 阅读5分钟
关注一下嘛,又不让你背锅!

问:下面程序的运行结果是什么?

  1. public class Test extends Date {  

  2.    public static void main(String[] args) {  

  3.        new Test().test();  

  4.    }

  5.  

  6.    public void test(){  

  7.        System.out.println(super.getClass().getName());  

  8.    }  

  9. }

答:打印的是 Test 类名。

由于 getClass() 方法在 Object 类是 final 的,子类不能覆盖该方法,所以在 test 方法中调用 getClass().getName() 方法的实质就是在调用从父类继承的 getClass() 方法,等效于调用 super.getClass().getName() 方法;然而 getClass() 方法来自 Object 类且其返回对象在运行时的类型,所以运行时类型为 Test,如果想得到父类的名称,应该调用 getClass().getSuperClass().getName() 获取。

问:Java 创建对象的方式有哪几种?

答:常见的创建对象方式主要有 5 种,该题在某些场合下会变着法子问你除过 new 的方式外还可以怎么创建对象,答案都是一样的,如下。

  • 使用 new 关键字(调用构造方法);

  • 使用 Class 类的 newInstance 方法(调用构造方法);

  • 使用 Constructor 类的 newInstance 方法(调用构造方法);

  • 使用 clone 方法(没有调用构造方法);

  • 使用反序列化(没有调用构造方法);

问:abstract 的方法是否可同时是 static、是否可同时是 native、是否可同时是 synchronized 的?为什么?

答:都不可以,原因如下。

首先 abstract 是抽象的(指方法只有声明没有实现,实现要放入声明该类的子类中),static 是一种属于类而不属于对象的关键字,synchronized 是一种线程并发锁关键字,native 是本地方法,其与抽象方法类似,只有声明没有实现,但是它把具体实现移交给了本地系统的函数库。

对于 static 来说声明 abstract 的方法说明需要子类重写该方法,如果同时声明 static 和 abstract,用类名调用一个抽象方法是行不通的。

对于 native 来说这个东西本身就和 abstract 冲突,因为他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统,如果同时出现就相当于即把实现移交给子类又把实现移交给本地操作系统,那到底谁来实现具体方法就是个问题了。

对于 synchronized 来说同步是需要有具体操作才能同步的,如果像 abstract 只有方法声明,则同步就不知道该同步什么了。

问:抽象类(abstract class)和接口(interface)有什么区别?

答:首先含有 abstract 修饰符的 class 为抽象类,abstract 类不能创建实例对象,含有 abstract 方法的类必须定义为 abstract class,abstract class 类中的方法不必是抽象的,abstract class 类中定义的抽象方法必须在具体的子类中实现,所以不能有抽象构造方法或抽象静态方法,如果子类没有实现抽象父类中的所有抽象方法则子类也必须定义为 abstract 类型。对于接口可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的(接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final)。

具体的区别如下:

  • 抽象类可以有构造方法;接口中不能有构造方法。

  • 抽象类中可以有普通成员变量或者常量或者静态变量;接口中没有普通成员变量和静态变量,只能是常量(默认修饰符为 publci static final)。

  • 抽象类中可以包含非抽象的普通方法和抽象方法及静态方法;接口中的所有方法必须都是抽象的,不能有非抽象的普通方法和静态方法(默认修饰符为 public abstract)。

  • 抽象类中的抽象方法访问类型可以是 public、protected 的;接口中的抽象方法只能是 public 的(默认修饰符为 public abstract)。

  • 一个子类可以实现多个接口,但只能继承一个抽象类。 

问:Java 访问修饰符有哪些?有什么区别和特点?

答:Java 的访问修饰符关键字主要有 public、protected、default、private 四个,其决定了紧跟其后被定义的东西可以被谁使用,具体的区别如下所示。

  • public 访问权限为当前类、同一个包、同包子类、非同包子类、其他包都可用。

  • protect 访问权限为当前类、同一个包、同包子类、非同包子类,其他包下无法访问到。

  • default 访问权限为当前类、同一个包,同包子类、其他包下和非同包子类无法访问到。

  • private 访问权限为当前类,同一个包、同包子类、非同包子类、其他包都无法访问到。

老铁们,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨(其他历史文章请查看公众号历史记录)~

看完分享一波嘛,和你的小伙伴一起讨论才更加有意思,右上角分享 666~

看个笑话放松一下

老婆给当程序员的老公打电话:下班顺路买十个包子,如果看到卖西瓜的,买一个。当晚老公手捧一个包子进了家门…老婆怒道:你怎么只买一个包子?!老公甚恐,喃喃道:因为我真看到卖西瓜的了。

Why must I be a tiny part of others' life since I am such a nice person? 

我大好的一个人,凭什么跑到别人的生命里去当插曲。