首页 > 编程语言 >【面试系列1】Java基础

【面试系列1】Java基础

时间:2023-03-12 23:56:46浏览次数:33  
标签:序列化 Java String 对象 子类 面试 系列 父类 方法

1.面向对象三大特征

  • 封装 
      1. 属性与方法:属性描述同一类事务的特征、方法描述同一类事务的操作。封装就是将同一类事务的属性、方法归结到同一个类里面。
      2. 将数据、操作封装起来,尽可能隐藏细节且不允许外部对象直接访问对象的内部信息,设计者提供系列比如Set、Get等授权方法来操作属性,有利于保护数据与解耦。
  • 继承 :就是将子类继承父类非private成员、方法,应该遵循里氏替换原则
      1. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间  
      2. 对拓展开放,对修改关闭,就是使用继承。
    * 多态 : 继承,重写,向上转型
        1. 表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
        2. 多态就是指一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
        3. 多态通俗的讲就是父类或接口定义的引用变量可以指向子类或实现类的实例对象,程序在运行时,该引用变量的方法是内存中正在运行的那个方法(子类或实现类里的方法),而不是引用变量的类型中定义的方法。
        4. 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

方法的重写Overriding和重载Overloading是Java多态性的不同表现。

  • 重写:父类与子类之间多态的一种表现
  • 重载:同一个类中多态的一种表现

2.long和double在并发环境下的安全问题?

由于long与double都是64字节,而jvm允许一次值读取32字节,当读取一个非volatile类型long变量时,如果读写操作在不同的线程中,有可能会读到某一个值的高32位和另一个值的低32位。使用volatile可以避免,volatile可以保证单次读写的原子性。

3.加载顺序


顺口溜:先静后动,先父后子
如果子类执行有参构造,父类会执行无参构造

注:静态代码块与静态成员变量的执行顺序(谁先谁执行)

4.访问控制权限

5.父类private方法,子类可以重新定义吗?

可以,父类private方法子类不可以继承,子类可以拥有同名方法。

6.序列化的几种方式

1. 原生序列化 Serializable
2. Hessian 序列化
3. Json(Jackson,fastJson)

序列化与反序列化

1. 为什么要有序列化,想要将内存中对像保存在磁盘,方便下次直接读取,想要对象在网络传输。
  序列化:ObjectOutputStream  writeObject
  反序列化:ObjectInputStream readObject

有些字段不想序列化? 比如密码。
1.static 表明时类的属性,对象序列化就不会序列化
2.transient 表明属性不能序列化

现在想一个问题,对于七层数据模型与5层数据模型,序列化协议应该放在哪里?
七层协议:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
五层协议:物理层、数据链路层、网络层、传输层、应用层
序列化协议应该在表示层,但是5层协议没有表示层,应该放在应用层。

7. java基本数据类型(Java中除了基本数据类型,皆是对象,也就是所谓的一切皆对象):

整形: byte、int、short、long
浮点型:float、double
字符型:char
布尔型:boolean

8. 包装数据类型

注:为什么使用包装类型?为了像操作对象一下操作基本类型,比如ArrayList中只能存包装类型。
整形:Byte、Integer、Short、Long
浮点型:Float、Double
字符型:Character
布尔型:Boolean

9.常量池技术

整形【-128,127】
浮点型:小数的话,过于多,常量池技术没有意义
字符型:【0,127】
布尔型:true,false

10.自动装箱与拆箱

基本类型转包装类型:Integer.valueOf()
包装类型转基本类型:i.intValue()

11. ==和equals的区别

基本数据类型:== 比较的是值,(equals只能用在于对象,不能用于基本类型
引用数据类型:== 比较的是地址,(未重写equals,比较的是地址;重写了equals,比较的是对象的属性)

image

12. 重写equals为什么要重写hashcode

保证:equals判断相同的对象,hashcode值一定要相同。
解释:hashcode 相同,对象不一定相等。比如说俩个对象会产生Hash冲突。

// hash(x) = x%5;
hash(7)=2
hash(12)=2

为什么要Hashcode与equals结合一起用?

  1. 先计算出Hashcode,进行快速定位
  2. 如果对应位置没有元素,就说明一定不存在。如果对应数组位置存在元素,然后要使用equals来判断是否真正存在。

13. final

final关键字,在Java中可以修饰方法变量

image
image

注意:String 底层数组被修饰为final。

14. finalize

就是在对象垃圾回收时候回收资源。

15. 接口与抽象类

image

相同点:
1. 接口与抽象类都不可以实例化
2. 接口和抽象类都可拥有抽象方法
3. 都可拥有默认实现(接口使用default关键字)

不同点:
1. 接口的访问修饰符只能是public static ,抽象类的访问修饰符和普通类一样
2. 接口不能有构造器,抽象类可以有构造器
3. 关键字不同 interface ,abstract class
4. 抽象类成员可以被更改,而接口中变量是public static final还必须要初始化。
5. 抽象类只能单继承,接口可以多实现

上层代码定义规范,下层代码实现逻辑

抽象类:更注重对子类共同属性的抽象,比如黑种人、黄种人、白种人 可以抽象出一个人的抽象类,具体实现由子类实例化。
接口:更注重对行为的一种规范,比如小王会跳舞,但是小刘不会,那我们可以给小王实现一个跳舞接口。

abstract class Father {
    void show() {
        show22();
        show33();
    }
    abstract void show33();
    abstract void show22();
}

16. 异常

都是继承自Throwable
Error是程序不可处理的错误,比如说StackOverFlow、OutOfMemory
Exception是异常,又分为检查型异常和非检查型异常(RuntimeException)

1.检查型异常:IOException,编译前要检查,否则编译不通过
2.运行时异常:RuntimeException,运行时才检查,比如数组越界异常

17. try-catch-finally

finally中内容不执行的情况:
1. 虚拟机异常结束
2. 线程退出

try-finally 中return语句执行情况
  1.try中有return,finally中有return 执行finally中return
  2.try中有return,fianlly没return,执行try中return

try-with-resources
  1.面对必须关闭的资源,实现AutoCloseable或Closeable 就可以使用

18.为什么Java中只有值传递?

java中只有值传递
对与基本数据类型传递的是值,对于引用类型传递的是地址。

基本数据类型,形参会拷贝一份数据,在方法内操作数据,不影响原来的数据
对于引用数据类型
1. 对于数组 传递数组的地址,arr[0]=1
2. 对于String字符串

    String a="abc";
    a="def"

它是将a的地址值换为def字符串对象的地址值
原来的abc没有任何改变,如果没有人引用它,可以被垃圾回收器回收

19. 不可变对象最大的好处

线程安全

20. label跳出指定循环 label:

        for (int i = 0; i < 10; i++) {
            aaaa:
            for (int j = 0; j < 20; j++) {
                if (i == 5) {
                    break aaaa;
                }
                System.out.println(i + " " + j);
            }
        }

21.throws与throw

throw 在方法里抛出具体异常
throws 在方法头抛出一个或多个异常,异常信息交给上层处理。

22.反转字符串

public static String reverseBuffer(String str) {
  return new StringBuffer(str).reverse().toString();
}

public static String reverseBuilder(String str) {
  return new StringBuilder(str).reverse().toString();
}

23. static 不能修饰局部变量

image

24. String有length() 数组有length属性

25. String.trim()删除前后空格

        String str = "    123    ";
        String trim = str.trim();
        System.out.println(str);  //"    123    "
        System.out.println(trim); //"123"

26. 构造器是否可以被重写?

构造器特征:方法名与类名相同
子类继承父类,类名都不同,所以不能重写。

标签:序列化,Java,String,对象,子类,面试,系列,父类,方法
From: https://www.cnblogs.com/handsometaoa/p/17209798.html

相关文章

  • java初识
    一java简介二开发环境搭建三开发第一个java程序四使用Eclipse进行java程序开发  Java简介java是一门面向对象的程序设计语言1995年由sun公司发布2010......
  • java学习日记20230312-构造方法
    构造方法/构造器基本语法[修饰符]方法名(形参列表){方法体;}构造器的修饰符可以是默认;构造器没有返回值;方法名和类名字必须一样;参数列表和成员方法一样的规则;构......
  • Java基础知识点(集合、ArrayList集合、基本数据类型对应的包装类及
    1.为什么要有集合?集合它可以自动扩容。2.集合存储数据类型的特点:不能直接存基本数据类型,需要将其变为包装类再存入,可以存引用数据类型。二:集合和数组的对比长度:数组的长度固......
  • 学习java第三周
    前言:这周过的很充实,因为对之前的内容没有很好理解本周一部分时间消化之前内容,经过三周的学习,对Java开始有了自己的认知,长路漫漫对自己的学习情况并不是很满意.对本周内......
  • java学习日记20230311-方法重载/可变参数/作用域
    方法重载java中允许同一个类中,多个同名方法的存在,但要求形参列表不一致:System.out.println();减轻了起名的麻烦减轻了记名的麻烦方法名必须相同形参列表必须不同(个......
  • java.lang.IllegalStateException: couldn't determine local port. Please set sprin
    2023-03-12记录一下出现上述问题的原因(1)问题描述:在打包springboot项目时,出现了上述问题(2)产生原因:在打包时,项目的生命周期中没有关闭test(3)解决方法:关闭test,如图,之后......
  • 学java前预备知识
    计算机预科1.打开CMD的方式开始+系统+命令提示符。Win+R输入CMD打开控制台(推荐使用)。在任意文件夹下,按住Shift键+鼠标右键打开命令行窗口。在资源管理......
  • JavaScript异步编程的深入理解,使用回调函数实现异步编程
    异步编程是指在程序运行时,任务不会按照函数调用的顺序依次执行,而是可以同时执行多个任务。JavaScript异步编程有很多种方式,例如使用回调函数、Promise、async/await等。下面......
  • 2023-03-12 Java中的链表
    链表LinkedListJDK中有标准库实现:java.util.LinkedList,和java.util.List对比,其实两者都可以看做是动态数组链表的特征线性数据结构——链表是真正的动态数据结构:数......
  • AI来实现代码转换!Python转Java,Java转Go不在话下?
    今天看到个有趣的网站,给大家分享一下。该网站的功能很神奇,可以实现编程语言的转化。感觉在一些场景之下还是有点作用的,比如你原来跟我一样是做Java的,因为工作需要突然转G......