每日一句: 想, 都是问题; 做, 才是答案.
构造器 Constructor 是否可被 Override?
构造器 Constructor 不能被继承, 因此不能重写 Override, 但是可以被重载 Overload.
接口是否可继承接口? 抽象类是否可实现 (implement) 接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的类方法?
接口可以继承接口. 抽象类可以实现接口. 抽象类可以继承具体类. 抽象类中可以有静态的类方法.
写 clone 方法时通常都有一行代码, 是什么?
clone 有缺省行为, super.clone(); 因为首先要把父类中的成员复制到位, 然后才是复制自己的成员.
面向对象的特征有哪些方面?
(1)封装
封装是保证软件部件具有优良的模块性基础, 封装的目标就是要实现软件部件的 "高内聚, 低耦合", 防止程序相互依赖性而带来的变动影响.
(2)抽象
抽象就是找出一些事物的相似性和共性之处, 然后将这些事物归为一个类, 这些类只考虑这些事物的相似和共性之处, 并且会忽略与当前主题和目标无关的那些方面, 将注意力集中在与当前目标有关的方面.
(3)继承
在定义和实现一个类的时候, 可以在一个已存在的类的基础上来进行, 把这个已存在的类所定义的内容作为自己的内容, 并可以加入若干新的内容, 或修改原来的方法使之更适合特殊的需要, 这就是继承. 继承是子类自动共享父类数据和方法的机制, 这是类之间的一种关系, 提高了软件的可重用性和可扩展性.
(4)多态
多态是指程序中定义的变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定, 而是在程序运行期间才确定, 即一个引用变量到底会指向哪个类的实例对象, 该引用变量发出的方法调用到底是哪个类中实现的方法, 必须在由程序运行期间才能决定.
Java 中实现多态的机制是什么?
靠的是父类或者是接口定义的引用变量可以指向子类或具体实现类的实例对象, 而程序调用的方法在运行期才动态绑定, 就是引用变量所指向的具体事例对象的方法, 也就是内存中正在执行的那个对象的方法, 而不是引用变量的类型中定义的方法.
abstract(抽象)类和 interface(接口)有什么区别?
含有 abstract 修饰符的类即为抽象类, abstract 类不能创建实例对象. 含有 abstract 方法的类必须定位为 abstract class,abstract class 中的方法不一定是抽象的. 抽象类中定义的抽象方法必须在具体 (Concrete) 类中实现, 所以不能有抽象构造方法和抽象静态方法. 如果子类没有实现父类中所有的抽象方法, 那么子类也必须定义为 abstract 类.
接口 (interface) 可以说是抽象类的一种特例, 接口中的所有方法必须是抽象的. 接口中的方法默认定义为 public abstract 类型, 接口中的成员变量默认为 public static final.
具体的语法区别为:
(1)抽象类可以有构造方法, 接口中不能有构造方法.
(2)抽象类中可以有普通成员变量, 接口中没有普通成员变量.
(3)抽象类中可以包含非抽象的普通方法, 接口中所有方法必须是抽象的.
(4)抽象类中的抽象方法的访问类型可以是 public, protected 和默认, 但接口中抽象方法只能是 public 类型的, 病默认为 public abstract 类型.
(5)抽象类中可以包含静态方法, 接口中不行.
(6)抽象类和接口中都可以包含静态成员变量, 抽象类中的静态成员变量的访问类型可以是任意, 但接口中的变量只能是 public static final 类型, 默认为此类型.
(7)一个类可以实现多个接口, 但只能继承一个抽象类.
应用上的区别:
抽象类在代码实现方面发挥作用, 可以实现代码的重用; 而接口更多的是在系统架构设计方法中发挥作用, 主要用于定义模块之间的通信契约.
抽象方法是否可以同时是 static 的, 是否同时是 native, 是否可同时是 synchronized?
abstract 的 method 不可以同时是 static 的, 因为抽象方法是要被子类继承实现的, 而 static 与子类没关系.
native 方法表示该方法要用另一种依赖平台的编程语言实现的, 不存在着被子类实现的问题, 所以, 它也不能是抽象的, 不能与 abstract 同用. 例如: FileOutputStream 类实现要与硬件打交道, 底层的实现使用操作系统相关 api 实现, 如在 windows 用 C 语言实现的, 所以, 查看 jdk 源码可以发现 FileOutputStream 的 open 方法的定义如下:
private native void open(String name)throws FileNotFoundException;
关于 synchronized 与 abstract 一起用的问题, 从来没有见过, synchronized 应该是作用在一个具体的方法上才有意义, 而且, 方法上的 synchronized 同步所使用的同步锁对象是 this, 而抽象方法上无法确定 this 指什么.
什么是内部类? Static Nested Class 和 Inner Class 的不同?
内部类就是在一个类的内部定义的类, 内部类中不能定义静态成员, 内部类可以直接访问外部类中的成员变量, 内部类可以定义在外部类的方法中, 如下所示:
- public class Outer{
- int out_x = 0;
- public void method(){
- Inner1 inner1 = new Inner1();
- public class Inner2{// 在方法体内定义的内部类
- public method(){
- out_x = 3;
- }
- }
- Inner2 inner2 = new Inner2();
- }
- public Class Inner1{// 在方法体外定义的内部类
- }
- }
在方法体外面定义的内部类的访问类型可以是 public,protected, 默认, private 等 4 种类型, 这就好像类中定义成员变量的访问类型一样, 他们决定了这个内部类的定义对其他类是否可见.
内部类可以引用它的包含类的成员吗? 有没有什么限制?
完全可以. 如果不是静态内部类, 没有什么限制.
如果你把静态嵌套类当做内部类的一种特例, 那在这种情况下不可以访问外部类的普通成员变量, 而只能访问外部类中的静态成员, 例如以下代码:
- class Outer{
- static int x;
- static class Inner{
- void test(){
- System.out.println(x);
- }
- }
- }
匿名内部类是否可以继承其他类, 是否可以实现接口?
可以继承其他类和实现接口. 不仅可以, 而是必须!
super.getClass()方法调用.
下面的程序输出结果是多少?
- import java.util.Date;
- public class Test extend Date{
- public static void main(String[] srgs){
- new Test().test();
- }
- public void test(){
- System.out.println(super.getClass().getName());
- }
- }
答案: Test
32. jdk 中那些类是不能被继承的?
不能继承的类是那些用 final 关键字修饰的类. 一般比较基本的类型或者防止扩展类无意间破坏原来 方法的实现的类型都应该是 final 的, 在 jdk 中 System,String,StringBuffer 等都是基本类型.
33. String 是最基本的数据类型吗?
基本数据类型包括 byte,short,int,long,float,double,boolean,char.
java.lang.String 类是 final 类型的, 因此是不可以继承这个类的, 不能修改这个类, 为了提高效率节省时间, 我们应该用 StringBuffer 类.
34. String s = "Hello"; s = s + "world"; 这两行代码执行后, 原始的 String 对象中的内容到底变了没有?
没有. 因为 String 类被设计成不可变类, 所以它的所有对象都是不可变对象. 在这段代码中, s 原先指向一个 String 对象, 内容是'Hello', 然后对 s 进行了 + 操作, 这时, s 不指向原来那个对象了, 而是指向了另一个 String 对象, 内容为 "Helloworld", 原来那个对象还存在于内存中, 只是 s 这个引用变量不再指向它了.
35. 是否可以继承 String 类?
不能, String 类是 final 类.
36. String s = new String("abc"); 创建了几个 String Object? 二者之间有什么区别?
两个对象."abc" 对应一个对象, 这个对象放在字符串常量缓冲区, 常量 "abc" 不管出现多少遍, 都是缓冲区中的那一个. new String 每写一遍, 就创建一个新对象.
37. String 和 StringBuffer 的区别.
Java 平台提供的两个类 String 和 StringBuffer 都可以存储和操作字符串, 即包含多个字符的字符数据. String 类表示内容不可改变的字符串. 而 StringBuffer 类表示内容可变的字符串. 另外, String 实现了 equals 方法, new String("abc").equals(new String("abc"))的结果为 true, 而 StringBuffer 没有实现 equals 方法 new StringBuffer("abc").equals(new StringBuffer("abc"))的结果为 false.
38. StringBuffer 和 StringBuilder 的区别.
StringBuffer 和 StringBuilder 类都表示内容可修改的字符串类, StringBuilder 是线程不安全的, 运行效率高, 如果一个字符串变量是在方法里面定义, 这种情况只可能有一个线程访问它, 不存在不安全的因素, 则用 StringBuilder. 如果要在类里面定义成员变量, 并且这个类的实例对象会在多线程环境下使用, 那么最好用 StringBuffer.
39. 如何把一段逗号分隔的字符串转换成一个数组?
参考:
(1)用正则表达式, 代码大概为:
`String[] result = orgStr.split(",");`
(2)用 StringTokenizer, 代码为:
- StringTokenizer tokener = StringTokenizer(orgStr, ",");
- String[] result = new String[tokener.countTokens()];
- int i = 0;
- while(tokener.hasNext()){result[i++] = tokener.nextToken();}
40. 数组有没有 length()方法? String 有没有 length()方法?
数组没有此方法, 有 length 属性; String 有 length()方法.
Java 笔试面试题(三)
来源: http://www.bubuko.com/infodetail-2685728.html