Java基础知识
一、重载(overload)与重写(override)的区别?
- 重载:发生在同一个类中,方法名必须相同,参数类型可以不同、个数可以不同、顺序可以不同、方法返回值和访问修饰符可以不同,发生在编译时
- 重写:发生在父、子类中,方法名、参数列表必须相同,返回值范围小于父类,抛出的异常范围小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private,则子类不可重写该方法
父类的构造器只能被重载,但不允许被重写
二、Java面向对象编程的三大特性
-
封装
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性或方法。如果属性不想被外界访问,我们可以选择不提供给外界方法。
-
继承
-
子类用于父类对象的所有属性和方法(包括私有属性 和私有方法),但是父类中的私有属性和方法,子类是无法访问的,只是拥有。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行拓展
-
子类可以用自己的方式实现父类的方法。
-
-
多态
在Java中,对于多态的核心表现主要有以下两点:
- 方法的多态性
- 方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体
- 方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的实现
- 对象的多态性
- 对象的向上转型:父类 父类对象 = 子类实例(自动的,90%都是这种情况)
- 对象的向下转型:子类 子类对象 = (子类)父类实例 (强制的,否则会抛出ClassCastException)
- 方法的多态性
public class 多态 {
public static void main(String[] args) {
//向上转型
Person p = new Student();
p.print(); //输出:2. 我是儿子!
//向下转型
/*Person person = new Student();
person.print();//输出:2. 我是儿子!
Student student = (Student) person;
student.only();//输出:只有子类有!!!*/
}
}
class Person{
public void print(){
System.out.println("1. 我是爸爸!");
}
}
class Student extends Person{
@Override
public void print() {
System.out.println("2. 我是儿子!");
}
public void only(){
System.out.println("只有子类有!!!");
}
}
四、接口和抽象类的区别是什么?抽象必须要有抽象方法吗?抽象能用final关键字修饰吗?
接口和抽象类的区别是什么?
-
接口的方法默认权限修饰符是public,所有的方法中不能实现具体的逻辑。(Java 8开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
-
接口中的实例变量默认是final类型的,而抽象类中则不一定
-
一个类可以实现多个接口,但最多实现一个抽象类。
-
一个类实现接口的话要实现接口的所有方法,而抽象类不一定
-
接口不能以new实例化,但可以声明,但是必须引用一个实现该接口的对象。从设计层面,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
备注: 早JDK8中,接口也可以定义 静态方法,可以使用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。
抽象类必须要有抽象方法吗?
答:抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。
抽象类能使用final关键字修饰吗?
答:抽象类不能使用final来修饰。当用final修饰一个类时,表明此类不能被继承。final修饰的类中所有成员方法都会被隐式地指定为final方法,这明显的违背了抽象类存在的意义。
五、 Java中值传递和引用传递?
答:Java中实际上只有值传递,并没有引用传递。
- 参数传递时,是拷贝实参的副本,然后传递给形参。(值传递)
- 在函数中,只有修改了实参所指向的对象内容,才会影响到实参。
注意:传递参数是引用类型,或者说是对象时,并不代表它就是引用传递。引用传递不是用来形容参数的类型的,不要被“引用”这个词本身迷惑了。
六、修饰符protected和default
答:
- protected 包内所有类可见,包外有继承关系的子类可见(protected修饰的方法可以在子类内部调用却不能在子类外部调用)
- default表示默认,不仅本类访问,而且是同包可见。(被default修饰的方法是接口的默认方法。既只要实现该接口的类,都具有这么一个默认方法,默认方法也可以被重写)
七、Java中Exception和Error
答:Exception和Error均继承自 Throwable 类。
Exception 分为 受查异常 和 非受查异常。
非受查异常即继承自RuntimeException类的异常,运行时捕获,常见的有:
- NullPointerException
- IllegalArgumentException
- ClassCastException
- IndexOutOfBoundException
- NumberFormatException
受查异常即非RuntimeException,在编译时被捕获,常见的有:
- IOException
- ClassNotFoundException
常见的Error有:
- StackOverFlowError
- NoClassDefFoundError
- OutOfMemoryError
八、Java “==” 和 equals() 的区别
答:== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。(基本数据类型中 ‘==’ 比较的是其值是否相等,而引用类型比较的是内存地址值是否相等)
而equals()方法的作用也是比较两个对象是否相等,但它的具体使用有如下两种场景:
- 对于未重写equals()方法的类,调用equals()方法时,相当于使用“==”比较;
- 重写equals()方法的类,比较的是对象的成员变量值是否相同