Java面试题-Java核心基础-第五天(面向对象基础)

目录

一、面向对象与面向过程的区别

二、创建一个对象用什么运算符,对象实体与对象引用有什么区别?

三、对象的相等和引用的相等有什么区别

四、如果一个类没有构造方法,程序能正常执行吗?

五、构造方法有什么特点,可以被重写吗?

六、面向对象的三大特征

七、接口和抽象类的异同


一、面向对象与面向过程的区别

面向过程是以方法为单位,都是直接的一个一个的方法调用

面向对象则是将万事万物都抽象成对象,然后调用对象里面的方法,来操作对象里面的数据。就是封装了一层相对于面向过程

面向对象更加的 易复用、易维护、易扩展

但是面向过程效率更好

二、创建一个对象用什么运算符,对象实体与对象引用有什么区别?

new

对象实体是直接存在于堆中,而对象引用不一定在堆中 如果是非static 非final的成员属性那么就存在与堆中 如果是static的final的就存在于方法区 如果是方法里面的就是存在于虚拟机栈的局部变量表中

三、对象的相等和引用的相等有什么区别

对象的相等是说对象的内容一样

对象的引用相等指的是对象的引用地址相等

四、如果一个类没有构造方法,程序能正常执行吗?

可以正常执行,因为系统会提供一个默认的无参构造方法

五、构造方法有什么特点,可以被重写吗?

特点:

  1. 样子:

和类同名,而且没有返回值 连void都没有

  1. 执行的时间

是创建对象的时候自动执行,无需手动调用

不能被重写

重写没有意义 构造方法肯定只能是在本类中用来创建本类的对象的

六、面向对象的三大特征

封装性

将数据隐藏在对象的内部,不能直接进行访问 可以通过对外的方法进行访问

它是使用权限修饰符实现的

不仅可以封装属性 还可以封装方法、构造器等 例如单例模式就是对构造器进行封装 使用private修饰 不能直接创建对象

封装性描述的是可见性的大小 是否能被看到

继承性

它是使用已存在的类来创建新的类的一种方法

就可以在子类中无需再次编写父类中的那些属性方法,就能获取到父类中的属性方法

大大提高了代码复用性、扩展性(无需编写,容易扩展)

注意:这里其实是能够获取到父类中所有的属性和方法,包括私有的

只是说私有的不能直接访问,而可以使用公共方法来进行访问

多态性

多态顾名思义就是多种形态,就是子类实例的多种形态

父类引用指向子类对象,这个子类对象可以是多变的 只要构成了父子关系或者是接口的实现关系

作用就是大大的提高了程序的灵活性,左边的父类引用可以不变,而右边的子类对象可以发生改变

其实面向接口、面向抽象编程就是基于多态性实现的 已到达高内聚低耦合的效果

例如在jdbc编程这个典型的面向接口编程,就是只需要设定一套接口规则 由不同的数据库厂商按照自己的情况来编写其具体的实现类即可

七、接口和抽象类的异同

相同点:

  1. 都不能被实例化

  2. 都可以在其中定义抽象方法,由具体的子类/实现类去根据需要具体实现

  3. 都可以定义默认方法 静态方法(接口JDK8中)

不同点:

  1. 接口描述的一种规范,一种功能 如果实现了一个接口 表示的是具备了一种功能 而没有其他关系了 而抽象类 继承了抽象类则是一种is a 的关系 父子关系 更多的是一种代码的复用

接口的典型应用就是面向接口编程,还有动态代理(GDK动态代理)等....

抽象类的典型应用:模板方法设计模式 可以在抽象类中定义好一套模板 只是保留部分的抽象方法,交由子类去具体实现

  1. 接口可以多继承 而抽象类只能单继承

  2. 接口中的属性必须是 public static final的 而且还必须赋上初值

而抽象类中属性默认是default的 可以不去赋上初值,有默认值 可以被子类重新定义 重新赋值

  1. 接口没有构造器 而抽象类中有构造器 即使不能实例化但也是有构造器的,这个构造器用于子类实例话的时候 需要调用父类的构造器 以达到能够获取到父类中的结构

八、深拷贝和浅拷贝了解吗?

浅拷贝是说也是拷贝了,但是仅仅只是基本数据类型的拷贝 而对于引用类型 只是复制了其引用 所以其对象实体并没有复制 还是使用的同一个对象实体

具体实现可以让类实现Cloneable接口,实现clone方法 然后在这个方法中调用Object类中的clone方法然后返回即可:

java 复制代码
public class Address implements Cloneable{
    private String name;
    // 省略构造函数、Getter&Setter方法
    @Override
    public Address clone() {
        try {
            return (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

可以发现其对象引用只是复制,实体没有复制:

java 复制代码
public class Person implements Cloneable {
    private Address address;
    // 省略构造函数、Getter&Setter方法
    @Override
    public Person clone() {
        try {
            Person person = (Person) super.clone();
            return person;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

结果:

java 复制代码
Person person1 = new Person(new Address("武汉"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());

深拷贝就是完完全全的拷贝,其引用类型的属性,不是简单的复制其对象引用,而是一个全新的对象然后再赋值给属性

可以通过再次设值的方法实现深拷贝:

java 复制代码
@Override
public Person clone() {
    try {
        Person person = (Person) super.clone();
        person.setAddress(person.getAddress().clone());
        return person;
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}

此时的结果就是false了

当然深拷贝简单一点的话,可以使用序列化和反序列化的方式

相关推荐
述雾学java24 天前
视图、MySQL、触发器、存储过程、流程控制语句
开发语言·mysql·java核心基础
述雾学java1 个月前
数据库分类、存储引擎、介绍、Mysql、SQL分类
sql·mysql·java核心基础
述雾学java1 个月前
JavaWeb,Tomcat基本思想,手写Tomcat
java·tomcat·java核心基础
述雾学java1 个月前
反射(第三篇)、代理模式、静态代理和动态代理、InvocationHandler实际应用
java·代理模式·java核心基础
述雾学java1 个月前
反射、 Class类、JVM的类加载机制、Class的常用方法
java·java基础·java核心基础
Java 第一深情4 个月前
面试题解,JVM的运行时数据区
jvm·java面试
非学无以质疑4 个月前
Java中的SPI机制
java·后端·编程语言·java面试
linweidong6 个月前
宁德时代Java面试题及参考答案
java·大厂面试·后端面试·java面试·java面经·java校招·后端offer
linweidong7 个月前
作业帮大数据面试题及参考答案
大厂面试·java面试·牛客网·flink面试·校招面经·flink面经·hadoop面试
北顾丶9 个月前
Redis作为缓存,如何与MySql的数据进行同步?
java·开发语言·redis·mysql·缓存·java基础·java面试