java基础(五)常见问题

本博客深入解析Java数据类型、类、抽象类、接口、多态等核心概念,涵盖数组、集合、字符串操作、多线程及JVM指令等关键知识点,适合Java初学者和进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JAVA数据类型

基本数据类型 各占多少内存 对应的包装类

引用类型

数据类型转换 小的转大的可以实现自动转换;大转小的需要强制转换;

String.valueof()强制转换

Integer.parseInt()

2.类(class)

属性 方法 成员变量

3.抽象类(abstract)

4.接口(interface)

5.抽象类和接口有什么相同点和不同点?

相同点, 都有抽象方法,都不能被实例化;也都可以非抽象方法(jdk1.8开始) 在接口中用default 关键字可以写非抽象方法;

不同点:接口中不能有属性和成员变量;只能有常量(static final 修饰的成员变量_),抽象类中可有属性和成员变量;接口中没有构造方法, 抽象类中有构造方法(不写的话默认有一个无参的构造方法) 抽象类中的构造方法为子类准备;

一个类能实现多个接口,只能继承一个抽象类;

6.什么情况下用接口什么情况下用抽象类?

由于抽象类中有属性的存在,继承抽象类也就继承了属性,继承抽象类相当于明确了一种身份,而接口中必须要实现抽象方法;也就是相当于表明了,子类子类能干什么,换句话说,明确一个类是什么的时候 用抽象类,明确一个类能干什么的时候用接口;

7.面向对象的三大特性:

封装---继承---多态;

8.怎么理解多态>?

多态是必须要建立在继承的基础之上的:

赋值多态 父类(引用)引用指向子类对象;(父类可以接受子类的对象)

传参多态 当参数类型是一个父类或者接口的时候,所有子类都可以进行传递

9.数组(array)

堆区中创建的一块连续的区域存放数据;可以是任意类型的数组;

冒泡排序,选择排序

10.集合:

ArrayList 底层动态数组可以实现动态添加 每次1.5倍;

HashSet 无序(和添加的顺序不同) 去重复

HashMap 映射(无序通过kay的自然排序)

11.ArrayList和LinkedList的区别>?

ArrayList 底层是数组 读速度快 尾部添加性能稍好 中间添加性能不如Linked

LinkedList 底层是链表 读速度不如Array 尾部添加性能稍差. 中间添加性能稍好

12.HashMap 和HashTable区别?

HashTable 是线程安全 HashMap 非线程安全 后者可以吧nul作为key,但是也只能有一个 ,前者的key中不能有null

13.String 字符串

底层 字符数组 存储位置 字符串常量池(不可变)

StringBuffer 和StringBuilder 动态字符串;

14.String StringBuffer StringBuilder 区别?

String 不可改变,如果拼接,每次都会生成新的字符串 耗费内存;

StringBuffer 动态字符串 线程安全

StringBuilder 动态字符串 非线程安全

15.Date 日期

16.Arrays 数组的工具类

17. equals 和==的区别?

==判断的是变量()或者对象指向的引用地址

equals 判断 判断HashCode计算出的值(如果两个字符串的值相同,那么最后返回的结果为true)

18.String a="abc" String a=new String("abc")有什么区别?

String a="abc"定义一个变量a 将一个变量a指向到字符串常量池中保存字符串abc的位置上

String a= new String("abc");定义一个变量a 堆区中创建一个String 对象,该对象保存的值,指向到字符串常量池中的abc的位置, 变量a指向到堆区中的String对象;

19.IO

File

FileInputStream

FileOutputStream

Reader

Wrider

inputStreamReader

BufferedReader

PrintStream(按行输出)

20.包装类的意义?

在类中定义属性使用包装类;解决基本数据类型有默认值的问题,

泛型中不能使用基本类型, 需要使用包装类代替

包装类如果比较值的话需要,拆箱

 

21.多线程

重写run();

通过start()启动线程;

sleep()休眠; 放弃对cpu的抢占;

synchronized 锁 并行转穿行

wait()

notify()和notifyAll();

套接字Socket

io流的传输;

22.内存模型和JVM指令;

23.控制台输入和输入

system.out 和system.in

24.脏读, 在一个输出的时候突然另一条进程打断导致读取了不完整的信息

解决办法可以加锁;

 

 

 

 

 

马士兵 java se复习

1.jdk 的安装

2 配置环境变量

a, path : .;%JAVA_HOME%\bin;

b, JAVA_HOME : JDK的安装目录;

c, classpath

3.jdk 和jre 和jvm的区别

jdk 开发工具包

jre java运行环境

jvm 虚拟机

 

JAVA 程序运行过程:(即是编译也是解释型语言)

1编译:吧java源文件编译成class字节码文件

2.运行:运行 class文件

4.变量:

1.局部变量:--定义在方法或者语句块内;从属于方法后者语句块,执行完之后消失

使用之前必须手动初始化

2.成员变量(实例变量 field) 定义在类里面 方法外面 没有用static 修饰的 从属于对象;

如果没有手动初始化成员变量,系统会自动舒适化,初始化的规则如下:

数字 0 布尔 :false char :\u0000 引用类型 :null;

3.静态变量:--类变量--定义在类里面,方法外面,用static修饰 从属于类 初始化规则同成员变量

 

5.基本数据类型:

byte--1个字节(-128----127) short---2个字节( ) int(4个字节 正负大约21亿) long float double char(2个字节) boolean

引用类型(引用了堆中的一个地址) 类 数组 对象 接口

类型的转换

 

表达式:

1.类型的自动提升:

如果有long 结果就是long

如果有double 结果就是double;

2.强制类型的转换:

 

运算符:

1.算数运算符

2.关系运算符

常见错误写法: 1<a<3;

3.逻辑运算符:

&& || ! & |

4.<<(左移一位相当于乘以2,) >>>(右移动一位相当于除以2);

5.扩展运算符:

+= *= /=

6.三目运算符:

(布尔表达式)? a : b;

6.控制语句

1.顺序结构

2.选择结构

if

ifelse

if else if esle

switch 多值选择器 break 跳出

3.循环结构

增强for

while

for

do while

break 强制终止整个循环

continue 结果本次循环 继续下一次;

 

7.标识符: 给类/方法/变量起名字

1.以字母 下划线 $ 开头

2.其余部分可以是:字母 数字 下划线 数字等;

3.不能为关键字;

 

8.面向对象基础:

1.对象的进化史;

a---基本数据类型阶段 数据少 无数据管理时代

b---数组 数据多了 将同类型数据放到一起 弱管理

c---结构体 数据多了,复杂了, 将不同类型的数据放到一起 强管理

d---对象 数据多了 类型复杂了 行为复杂了,

2.对象和类

类是抽象的 相当于一个末班, 对象是具体的,是类的实例化.

3.定义类:

class 类名{ //类名要规范

//属性

private 数据类型 属性名 //建议增加相应的get set 方法

//方法

 

 

//构造方法

1.方法名必须和类名保持一致

2.无返回类别

3.通过new 来调用

4.无参构造器的问题

a---如果没有手动定义构构造器 系统会自动为我们添加一个无参的

b---如果我们定义了自己的构造器,系统就不会为我们添加无参的

5.构造方法的第一句总是super 调用直接父类的构造方法;

//作用

new对象和初始化属性

}

 

4.重载 OverLoad

同一个类种 同一个方法名, 参数的类型或者数量不同;

返回值不同 不构成重载;

形参名称不同,不构成重载;

 

this:

普通方法中:调用本方法的对象

构造方法中: 正要初始化的对象

还可以用来 调用其他的构造方法

super:

static:

用他修饰的变量或者方法 就变成了静态变量或者类变量,从属于类,通过类名既可以调用, 实际存储在方法区中;

package:

必须位于非注释行的第一句

包名:域名写到这

import :

引入外部的类;

final:

修饰变量 :常量;

修饰方法: 不能被重写;

修饰类: 不能被继承;

5.面向对象的三大特性

封装

通过 private / default / pretected/ public 关键字实现属性或者方法的封装

实现 高内聚 低耦合;

继承:

通过extends 两个好处:

代码的重用

通过继承实现对现实世界更加准确的建模

多态:

三个必要条件:

继承 方法的重写 父类引用指向子类对象

动态绑定 静态绑定

 

抽象类:

包含抽象方法的类,一定是抽象类 抽象方法必须被子类重写

抽象类不能被new

抽象类可以包含 普通方法, 成员变量;

接口:

用interface定义接口

类实现接口:implements 可以实现多个接口

接口可以实现多继承

接口定义了一组规范,实现了现实世界中这样的逻辑,如果你是....则 必须能......

 

内存机制:

栈:

存放局部变量

不可以被多个线程共享

空间连续,速度快

堆:

存放独享

可以被多个线程共享

空间不连续 速度慢,但是灵活;

方法区:

存放类的信息 代码,静态变量,字符串常量等;

可以被多个线程共享

空间不连续 速度慢,但是灵活

垃圾回收器(GC Garbage Collection)

1.程序员不能调用垃圾回收器 ., 但是可以通过system.gc() 建议回收

2.fianllize:一般需要去调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值