JAVA基础思路整理

目录

文章目录

前言

一、JAVA概述

1.1 JAVA是什么

1.2 JVM、JRE、JDK的区别?

1.3 什么是字节码?字节码的好处?

1.4 为什么说Java语言编译与解释并存?

二、JAVA基础语法

2.1 基本数据类型

2.2 引用数据类型

2.3 什么是自动类型转换、什么是强制类型转换

2.4 什么是自动拆箱、自动装箱

2.5  switch 是否能作用在 byte/long/String 上?

2.6 break,continue,return的区别

2.7 说说自增自减运算?

2.8 数据高准确性是如何保证的?

三 面向对象

3.1 面向对象三大特性

3.2 重载和重写的区别

3.3 访问修饰符public、private、protect、default区别

3.4 this关键字

3.5 抽象类和抽象接口区别

3.6 成员变量与局部变量的区别

3.7 成员变量与静态变量的区别

3.8 final关键字

3.9 ==和equals的区别

3.10 为什么重写hashcode方法时要重写equals方法

3.11 java是值传递还是引用传递

3.12 深拷贝和浅拷贝

3.13 创建对象有哪几种方式?

3.14 new子类的时候,子类和父类静态代码块,构造方法的执行顺序

四 JAVA进阶

4.1 Object类的常见方法:

4.2 Java中异常处理体系:

4.3 String类

String 类可以继承吗?

String 有哪些常用方法?

String特点

StringBuilder特点

 怎么保证String类不可变的?

4.4 I/0流

为什么有了字节流还要有字符流?

BIO、NIO、AIO 之间的区别

4.5 序列化

4.6 泛型

4.7 反射

反射的使用场景可以举例几个吗?

反射的原理

五  JDK新特性

总结


前言

回忆JAVA基础内容

一、JAVA概述

1.1 JAVA是什么

JAVA是一种面向对象的编程语言,具有平台无关性,即一次编译处处运行。可以在Linux、Windows平台上运行,只需要安装一个JVM虚拟机。

1.2 JVM、JRE、JDK的区别?

(1)JVM是java虚拟机,针对不同的操作系统,有不同的 JVM 实现。JVM 负责将 Java 字节码转换为特定平台的机器码,并执行。

(2)JRE是java运行环境,包括虚拟机以及java运行所需要的库

(3)JDK是java开发环境包括java运行环境以及编译器javac、java调试器等开发工具。

1.3 什么是字节码?字节码的好处?

字节码是Java程序编译后的.class文件,字节码文件能够被虚拟机识别,实习java语言的跨平台性。

编译:.java文件编译成.class文件

解释:虚拟机将字节码翻译成平台的机器码

运行:对应的机器执行机器码

1.4 为什么说Java语言编译与解释并存?

Java程序需要先经过编译生成字节码文件.class,这种字节码经过虚拟机,解释成操作系统的机器码,再由机器执行。因此,java语言编译与解释并存。

二、JAVA基础语法

2.1 基本数据类型

2.2 引用数据类型

包括类、接口、数组

2.3 什么是自动类型转换、什么是强制类型转换

自动类型转换:自动类型转换是由小转大。

强制类型转换:是由大转小,可能会丢失精度或一些数据。

2.4 什么是自动拆箱、自动装箱

自动拆箱是指将引用数据类型赋予基本数据类型。

自动装箱是将基本数据类型转成引用数据类型。

Integer i = 10;  //装箱
int n = i;   //拆箱

2.5  switch 是否能作用在 byte/long/String 上?

JDK7以后除了Long都可以

2.6 break,continue,return的区别

break打破循环继续执行方法体的程序

continue结束此次循环开启下一次循环

return结束方法体的程序

2.7 说说自增自减运算?

当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。

int i = 1;

i=i++;

现在i还是为1;对于 JVM 而言,它对自增运算的处理,是会先定义一个临时变量来接收 i 的值,然后进行自增运算,最后又将临时变量赋给了值为 2 的 i,所以最后的结果为 1。

相当于这样的代码:

int i = 1;
int temp = i;
i++;
i = temp;
System.out.println(i);

2.8 数据高准确性是如何保证的?

不能用Double和Float,JAVA中有BigDecimal类,或者将浮点数转换成Int来进行计算

三 面向对象

3.1 面向对象三大特性

封装:将数据和操作方法捆绑到一起,形成一个独立的对象

继承:允许一个类继承现有类的字段和方法,提高代码复用性

多态:不同类的对象对同一消息做出响应,表现出不同的行为

           有三个前置条件:子类继承父类、子类重写父类方法、父类引用指向子类对象。

            多态提高了代码的灵活性和可扩展性,使代码更容易维护和扩展。

3.2 重载和重写的区别

重载是类中的方法有不同的参数,参数不同执行的方法不同这是重载。

重写是子类继承父类,重写父类的方法。参数相同、返回类型相同、方法名相同,但方法体可能不同

3.3 访问修饰符public、private、protect、default区别

private 修饰的成员变量或方法 仅本类可见

default修饰的成员变量或方法 本类、同一包内可见

protect修饰的成员变量 本类、同一包下、子类可见

public 全局范围可见

3.4 this关键字

this关键字指向的是这个类的本身若参数名称和成员变量名称相同可用this.变量名来区分

3.5 抽象类和抽象接口区别

抽象类符合is-a的关系,抽象接口符号has-a的关系,比如一个类可以序列化的时候,他只需要实现Serializable接口就可以。

抽象接口,只包含抽象方法,JDK8以后支持默认方法

抽象类中可以包含抽象方法和其他方法,并且可以有成员变量,抽象类可以有构造方法

3.6 成员变量与局部变量的区别

存储位置:成员变量存储在堆内存中,局部变量存储在栈内存中

访问变量修饰符:成员变量可以被访问变量修饰符修饰,局部变量不可以

生命周期:成员变量属于类和类的生命周期一样,局部变量属于方法方法结束即结束

成员变量若没初始值会自动赋,局部变量不行。

3.7 成员变量与静态变量的区别

成员变量属于实例的,实例.属性名

静态变量属于类的,调用时用类名.属性名

静态变量只能被静态方法调用,成员变量可以被任何方法调用

静态变量存储在类的内存中,成员变量存储在实例的内存中。

3.8 final关键字

final修饰的类不能被继承

final修饰的方法不能被重写

final修饰的变量不能改变

3.9 ==和equals的区别

equals是obejct类的方法,如果不改写的话判断的是两个对象是否是同一个

==如果用在基本类型上判断的是值大小是否一样,引用类型则是判断其中的地址是否一样

3.10 为什么重写hashcode方法时要重写equals方法

hashcode方法是获取对象的哈希码,哈希码是根据对象地址或属性得到的32位int类型,一般不会重复。

哈希的集合类依据这一点来正确检索和存储对象。如果只重写equals方法而不重写hashcode方法可能造成认为相同的两个对象存储都存储在hashmap或set中,从而导致集合类无法正确处理这些对象

3.11 java是值传递还是引用传递

java是值传递。当一个对象被作为参数传递到方法中时,参数的值就是该对象的引用。引用的值是对象在堆中的地址。

那引用类型变量有什么特点

引用类型变量存储的是对象的地址,而不是对象本身。

3.12 深拷贝和浅拷贝

深拷贝:完全拷贝一个对象,堆中会新创建一个对象,拷贝被拷贝对象的成员的成员变量的值,堆中的对象也会拷贝一份

浅拷贝:堆中不会再创建一个对象,拷贝被拷贝对象的成员的成员变量的值,即基本变量的值和引用变量的地址值。

3.13 创建对象有哪几种方式?

new 关键字创建对象

通过反射机制:

Class claz = Class.forName("类的全路径");
类名 person = (类名) claz.newInstance();

 clone创建 需要实现cloneable接口并重写clone方法:

Person person = new Person();
Person person2 = (Person) person.clone();

通过序列化机制创建,需要实现serializable接口

3.14 new子类的时候,子类和父类静态代码块,构造方法的执行顺序

1:执行父类静态代码块(类第一次加载时执行)

2:执行子类静态代码块(类第一次加载时执行)

3:父类构造方法

4:子类构造方法

四 JAVA进阶

4.1 Object类的常见方法:

clone、hashcode、toString、euqals、notify、notifyall、wait、finalize。

4.2 Java中异常处理体系:

顶层:throwable类

其次:error、exception类

error类是虚拟机不能处理的错误,直接导致程序终止

exception类分为runtimeException(运行时异常)和其他异常

可自定义异常,需要继承exception类/runtimeException类,常用到的异常方法是getMessage

4.3 String类

String 类可以继承吗?

不可以,String类被final修饰不能被继承

String 有哪些常用方法?

length、charAt、substring(int start , int end)从start,到end-1、contains、

String特点

String类对象是不可变的,其每次修改拼接操作实际上会产生一个新的String对象,而不是修原对象

StringBuilder特点

StringBuilder不是线程安全的。它不适用于多线程环境。

Stringbuilder每次增删改操作是在原来对象上操作而不是创建新对象

Java中String的+操作实际是通过StringBuilder实现的

StringBuider 增 append 删

  • delete(int start, int end):删除从start(包括)到end(不包括)索引之间的字符。
  • deleteCharAt(int index):删除指定索引位置的单个字符。

 怎么保证String类不可变的?

1,String类内部的私有字符串数组来存储字符数据。

private final char value[];
2. String 类没有提供任何可以修改其内容的公共方法

3. String 类本身被声明为 final,这意味着它不能被继承。

4.4 I/0流

通过数据流向划分有输入流和输出流

通过类型划分有字符流、字节流

I/O流用到了一个设计陌生-装饰器模式

为什么有了字节流还要有字符流?

字符流是JVM虚拟机通过转换得到的,如果我们不知道编码类型容易出现乱码

字符流方便我们对字符进行操作,涉及到字符用字符流,视频音频用字节流

BIO、NIO、AIO 之间的区别

BIO:阻塞模型

基于 Socket 和 ServerSocket 进行网络通信。每一个连接都需要一个线程去处理,线程执行期间不得处理其他任务

NIO:非阻塞模型

线程在等待I/O操作时可以处理其他任务,通过Selector监控channel上的事件,服务器可以用一个线程处理多个客户端连接,通过 Selector 监听多个 Channel 来实现多路复用。

AIO:异步阻塞模型,线程发起I/O请求后立即返回,I/O操作完成时通过回调函数通知线程,线程发起一个读写操作后不必等待其完成,可以立即进行其他任务,并且当读写操作真正完成时,线程会被异步地通知。

4.5 序列化

序列化是将对象转化为字节流的过程,以便该对象保存到文件、数据库或者进行网络传输。

反序列化是将字节流转换回对象的过程,以便构建原始对象。

需要进行序列化的对象需要继承serialiable接口。

java序列化不包含静态变量,只保存对象状态。

serialVersionUID它的作用是确保在序列化和反序列化过程中,类的版本是兼容的。

如果有些变量不想被序列化用transient关键字来修饰。

序列化的三种方式:Java对象流序列化、JSON序列化、ProtoBuff序列化

4.6 泛型

泛型的本质是类型参数化、有泛型类、泛型接口、泛型方法

符号 ? 表示不确定的JAVA类型、 T(type)表示具体的一个java类型、K V表示键、值 ;E 代表element

4.7 反射

通常创建一个对象是 通过new关键字来实现的,比如有一个Person类

new Person类对象时,类信息在编译时就确定了,假如在编译期间无法确定类的信息,但又想在运行时获取类的信息、创建类的实例、调用类的方法,这时候就用到反射

反射功能主要通过class类以及reflect包中的Method、Filed、Constructor类来实现。

反射的使用场景可以举例几个吗?

Spring框架大量使用反射来动态加载和管理Bean

java动态代理机制通过反射来创建代理类

反射的原理

Java 程序的执行分为编译和运行两步,编译之后会生成字节码(.class)文件,JVM 进行类加载的时候,会加载字节码文件,将类型相关的所有信息加载进方法区,反射就是去获取这些信息,然后进行各种操作。

五  JDK新特性

JAVA 8 运行接口有默认方法和静态方法

增加Lambda表达式

一种简洁的方式来表示匿名方法,使 Java 具备了函数式编程的特性。比匿名内部类要简洁很多。

所谓的函数式编程,就是把函数作为参数传递给方法,或者作为方法的结果返回

增加stream流,有中间操作和终端操作,中间操作例如map、filter 终端操作有collect、sorted。

引入全新的日期和时间API

引入Optional是为了防范空指针异常


总结

java复习串联知识,继续加油

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值