1.面向对象的封装,追求的是“低内聚,高耦合”,解释下内聚和耦合?
内聚:程序内的各个模块之间的关系紧密程度。
耦合:外部程序(子程序)之间的关系紧密程度。
2.封装的几个关键字:private、default、protected、public的含义?
private | default | protected | public |
私有的,只允许本类访问 | 无修饰词,默认的,同一个包内可以访问 | 受保护的,子类及本包的类都可以访问 | 公开的,所有的类都可以访问 |
3.一般,属性是否要设置为private?设置为private,如何让外部访问该属性?
属性一般要设为private,这样可以防止被赋上一个非法值。
编写公有的get取值方法让外部访问。
4.继承的好处是什么?单继承相比多继承的有优势是什么?假如父类中有main方法,子类可以继承吗?
继承好处一:继承的本质在于抽象。类是对象的抽象,继承是对某一批类的抽象。
好处二:提高了代码的复用性。
单继承有利于系统的维护,使得类与类之间的关系变得简单。
子类不能继承父类main()方法,main方法只能有一个。
5.定义某个类时,没有写extends,这个类有父类吗?Object是所有类的根类吗?
有,没有使用extends,则继承了Object类。
Object是所有类的根类(而不是直接父类)。
6.重写(Override)指的是什么?
指的是子类对父类中方法的重写。
7.super指的什么?构造方法中第一句总是super吗?
super指的是直接父类。
构造方法的第一句除了super(),也可以是this()。
8.叙述有继承结构时,构造方法的调用顺序。
继承条件下构造方法的调用规则:
如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”,效果是一样的。
如果子类的构造方法中通过super显式调用父类的有参构造器,那将执行父类相应的构造方法,而不执行父类的无参构造器。
如果子类的构造方法中通过this显式调用自身其他的构造方法,在相应的构造方法中,应用以上两条规则。
特别注意的是:若存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。
9.重写中,子类的返回值类型可不可以跟父类的不完全一致。
可以
子类的返回值可以与父类相同,也可以是父类方法返回值的子类。
10.如何判断两个对象的内容是否相同?重写equals()方法有什么要求
判断两个对象的内容是否相同,需要重写Object的equals()方法
11.多态的三个必要条件?
继承
方法重写
父类引用指向子类对象
12.什么是向上转型?什么是向下转型?
向下转型:父类引用指向子类对象(子类引用不能指向父类对象)
向上转型:将父类引用转成真实的子类对象。
看下面的例子:有2个类,Father是父类,Son类继承自Father。
Father f1 = new Son(); // 这就叫 upcasting (向上转型) // 现在f1引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型) // 现在f1还是指向Son对象
第2个例子:
Father f2 = new Father();
Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象
你或许会问,第1个例子中:Son s1 = (Son)f1; 为什么是正确的呢。
很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。
而f2 被传给了一个Father对象,Father f2 = new Father();子类s2引用不能指向父类对象。
13.多态的使用场景有哪些?
①使用父类做方法的形参,实参可以是该父类的任意子类类型。
②使用父类做方法的返回值类型,返回值可以改父类的任意子类对象。
可以参考我后面的一篇博客——(10)Java内存示意图(其二)
14.Java的方法绑定采用的是动态绑定还是静态绑定?
静态方法,构造器,private方法,用关键字super调用的方法是静态绑定;
通过对象调用的方法,采用动态绑定。
15.final修饰变量、方法、类分别表示什么含义?
final修饰变量表示:不可改变,一旦赋了初值,就不能被重复赋值,称为常量;
final修饰方法表示:修饰方法不能被子类重写;
final修饰类表示:该类不能有子类,即不能被继承。例如String、Math等
16.final修饰的方法能被重载和重写吗?String类能不能被继承?
final修饰的方法可以被重载,不能被重写。
String类不能被继承,因为String类是使用final修饰的类。
17.包含抽象方法的类是抽象类吗?抽象类一定包含抽象方法吗?抽象类可以有普通方法吗?
包含抽象方法的类是抽象类。
抽象类不一定含抽象方法,可以有普通方法。
18.抽象类能不能定义构造方法?抽象类能被new出来吗?即抽象类的构造方法能被调用吗?
抽象类可以定义构造方法。
抽象类不能被new出来,抽象类的构造方法可被其子类调用。
19.接口中只能定义常量和抽象方法吗?接口中怎样定义常量和抽象方法?
jdk1.7之前,接口中只能定义静态常量和公共的抽象方法。
jdk1.8中,接口中可以定义静态方法。
接口中定义常量:public static final 常量名;
接口中定义抽象方法:public abstract 方法名(){ }
20.接口中可以定义普通变量和普通方法吗?从设计接口的角度说明为什么?接口描述了现实世界中什么逻辑?
接口中不能定义普通方法或普通变量;因为接口就是一种规范,定义一种规则。
接口描述了现实世界是“如果你是...,则必须能...”的思想。
21.接口可以被new吗?接口中有多继承吗?一个类能否实现多个接口?
接口不能被new;
接口中有多继承;
一个类能够实现多个接口。
22.如何对一个数组的多个对象按照不同的依据进行排序?
对象实现Comparable接口;
或者定义比较规则的类实现Comparator接口。
23.模拟实现Comparable和Comparator接口
实现Comparable接口:
public class Student implements Comparable<Student> {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
return this.age-s.getAge();
}
}
实现Comparator接口:
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student s1,Student s2) {
return s1.getAge()-s2.getAge();
}
}
24.java中GC指什么?
GC是指垃圾回收。
程序员无权调用垃圾回收器,jvm的垃圾回收机制会自动进行垃圾回收。
不像c++那样需要手动编写垃圾回收的代码,所以垃圾回收机制避免了由于程序员忘记而造成的各种内存溢出等问题。