java面试-java基础(中)


一、面向对象OOP和面向过程OPP区别?

  • 面向对象:将问题中遇到的实物抽象和分类成一个个的类,并用通过创建一个个对象去解决现实中的问题
  • 面向过程:将问题分成多个步骤,将每个步骤写成一个个函数,并通过顺序调用解决现实中的问题
  • 区别
    • 关注点不同:面向对象关注现实世界中的对象及其关系,而面向过程关注解决问题的步骤和过程。
    • 数据和函数的关系不同:在面向对象中,数据和操作数据的方法被封装在对象中,而在面向过程中,数据和函数是分离的
    • 代码组织方式不同:面向对象通过类和对象来组织代码,具有更好的模块化和可重用性;而面向过程通常按照功能或步骤来组织代码,可能导致代码结构混乱
    • 扩展性和可维护性不同:面向对象通过封装、继承和多态等特性提高了代码的扩展性和可维护性;而面向过程在这方面表现相对较差

二、面向对象有哪些特性?

  • 封装:把对象的属性私有化,同时提供可以被外界访问的属性的方法.代码复用、安全性高
  • 继承: 以已存在的类的定义作为基础建立新类。新类的定义可以增加新的属性或新的方法,也可以继承父类的属性和方法。通过继承可以很方便地进行代码复用,扩展性强,但耦合度增强
    • 一个类只能继承一个类,所有的类都直接或者间接的继承了Object类
    • 子类自动拥有父类所有有属性和方法,但只能访问父类非私有属性和方法
    • 默认访问子类的[同名]成员变量/方法,不存在则访问父类非私有[同名]成员变量/方法。即使在父类构造方法中调用也能自动调子类方法
  • 多态:指程序中定义的引⽤变量所指向的具体类型和通过该引⽤变量调用的⽅法在编程时并不确定,⽽是在程序运⾏期间才确定,即⼀个引⽤变量到底会指向哪个类的实例对象,该引⽤变量发出的⽅法调⽤到底是哪个类中实现的⽅法,必须在由程序运⾏期间才能决定。实现方式:子类继承父类、子类重写父类的方法、父类引用指向子类的对象或者类实现接口、类实现接口的方法,类引用指向接口

三、重载和重写区别?

  • 方法重载overload:同一个类中多个名称相同、参数类型或个数或顺序不同的方法
  • 方法重写override:父子类中方法名、参数列表、返回值相同、但方法体不同的方法
    • 返回值、异常小于等于,少于等于父类
    • 访问修饰符大于等于父类
    • static方法,final方法,private方法,构造器Constructor不能被继承,因此不能重写Override

四、private,default,protected,public访问控制符范围

  • private本类,default同包、protected同包及其子类,public所有

五、抽象类和接口有什么区别?如何选用?

  • 相同点
    • 都可以包含抽象方法
    • 都不能直接实例化对象;直到抽象方法都覆盖完了才可以创建对象
  • 不同点
    • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了单继承)
    • 抽象类可以定义构造函数;接口不能
    • 抽象类可以包含具体方法;接口在jdk8才有默认方法
    • 抽象类可以包含私有方法,接口在jdk9才有
  • 二者的选用
    • 优先选用接口,尽量少用抽象类
    • 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类

六、this关键字有什么作用?

  • this代表对象本身
  • 作用:
    • 对象本身的引用
    • 区分重名的形参和成员变量
    • 引用本类构造函数
class A{
    private String name;
    private Integer age;
    public A(String name){
        this.name = name;
    }
    public A(String name,Integer age){
        this(name);//引用本类构造函数
        this.age = age;//区分重名的形参和成员变量
    }
    
    public void fun(){
        System.out.println("fun");
    }
    public void fun2(){
        this.fun();//对象本身的引用
        System.out.println("fun2");
    }
}

七、final、finally、finalize区别?

  • final是修饰符,修饰类不能被继承,修饰方法不能被重写,修饰变量不能被修改且必须在声明时初始化值。不可变指的是变量的引用不可变,不是引用指向的内容的不可变。
  • finally只能在try/catch语句中,无论try块中的代码是否抛出异常,finally块中的代码一定会执行。常用于释放资源(I/O)。不会被执行的情况:在finally语句块中发生了异常;在代码中用了System.exit()退出程序;
  • finalize:在Object类中的方法,在垃圾收集器删除对象之前对这个对象调用一次。finalize被调用不一定会立即回收该对象,所以有可能调用finalize后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会再次调用finalize了,进而产生问题,因此不推荐使用。

总结

本文介绍了java基础的面试(中),如有问题欢迎私信和评论

  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值