Java部分基础知识面试复习

Java基础知识

一、重载(overload)与重写(override)的区别?

  • 重载:发生在同一个类中,方法名必须相同,参数类型可以不同、个数可以不同、顺序可以不同、方法返回值和访问修饰符可以不同,发生在编译时
  • 重写:发生在父、子类中,方法名、参数列表必须相同,返回值范围小于父类,抛出的异常范围小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private,则子类不可重写该方法

父类的构造器只能被重载,但不允许被重写

二、Java面向对象编程的三大特性

  1. 封装

    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性或方法。如果属性不想被外界访问,我们可以选择不提供给外界方法。

  2. 继承

    • 子类用于父类对象的所有属性和方法(包括私有属性 和私有方法),但是父类中的私有属性和方法,子类是无法访问的,只是拥有

    • 子类可以拥有自己的属性和方法,即子类可以对父类进行拓展

    • 子类可以用自己的方式实现父类的方法。

  3. 多态

    在Java中,对于多态的核心表现主要有以下两点:

    • 方法的多态性
      1. 方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体
      2. 方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的实现
    • 对象的多态性
      1. 对象的向上转型:父类 父类对象 = 子类实例(自动的,90%都是这种情况)
      2. 对象的向下转型:子类 子类对象 = (子类)父类实例 (强制的,否则会抛出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关键字修饰吗?

接口和抽象类的区别是什么?

  1. 接口的方法默认权限修饰符是public,所有的方法中不能实现具体的逻辑。(Java 8开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。

  2. 接口中的实例变量默认是final类型的,而抽象类中则不一定

  3. 一个类可以实现多个接口,但最多实现一个抽象类。

  4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定

  5. 接口不能以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()方法的类,比较的是对象的成员变量值是否相同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值