重学java—基础知识点

2023-11-07

数据类型

1.基本数据类型:
boolean/1
byte/8
char/16
short/16
int/32
float/32
long/64
double/64

每个类型都有它对应的包装类。自动装箱和拆箱操作

2.缓存池
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
a和b是同一个对象
Integer 缓存池的大小默认为 -128~127。超过改范围之后,对象就不是同一个了

3.String

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

char数组被final修饰,不可变
不可变的好处

  1. 可以缓存 hash 值 因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
  2. String Pool 的需要 如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
  3. 安全性 String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
  4. 线程安全 String 不可变性天生具备线程安全,可以在多个线程中安全地使用。

4.String, StringBuffer and StringBuilder

  1. 可变性 String 不可变 StringBuffer 和 StringBuilder 可变
  2. 线程安全 String 不可变,因此是线程安全的 StringBuilder 不是线程安全的 StringBuffer 是线程安全的,内部使用 synchronized 进行同步

5 HotSpot虚拟机中字符串常量池保存
运行时常量池(Runtime Constant Pool)是虚拟机规范中是方法区的一部分,在加载类和结构到虚拟机后,就会创建对应的运行时常量池;而字符串常量池是这个过程中常量字符串的存放位置。所以从这个角度,字符串常量池属于虚拟机规范中的方法区,它是一个逻辑上的概念;而堆区,永久代以及元空间是实际的存放位置。 不同的虚拟机对虚拟机的规范(比如方法区)是不一样的,只有 HotSpot 才有永久代的概念。

6 java是值传递的形式传入方法中,而不是引用传递;但是对象类似于一个指针,存储的是对象的地址

继承

访问权限

1.public ,protected,privaid区别:
| 区别 | public | protected | [default] | private |

| :----------------: | :----------- | :-----------: | :------------ | :----------: |

| 同一个类中 | 可以访问 | 可以访问 | 可以访问 | 可以访问 |

| 同一个包中 | 可以访问 | 可以访问 | 可以访问 | 不可以 |

| 不同包的子类 | 可以访问 | 可以访问 | 不可以 | 不可以 |

| 不同包的非子类 | 可以访问 | 不可以 | 不可以 | 不可以 |

设计良好的模块会隐藏所有的实现细节,把它的 API 与它的实现清晰地隔离开来。模块之间只通过它们的 API 进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏或封装。因此访问权限应当尽可能地使每个类或者成员不被外界访问。

抽象类
抽象类和抽象方法都使用 abstract 关键字进行声明。抽象类一般会包含抽象方法,抽象方法一定位于抽象类中。
抽象类和普通类最大的区别是,抽象类不能被实例化,需要继承抽象类才能实例化其子类

接口
接口是抽象类的延伸,在 Java 8 之前,它可以看成是一个完全抽象的类,也就是说它不能有任何的方法实现。 从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。
在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
接口的成员(字段 + 方法)默认都是 public 的,并且不允许定义为 private 或者 protected。
接口的字段默认都是 static 和 final 的。

Object类

1.eaquals方法
equals() 与 ==
基本类型:==判断两个值是否相等,基本类型没有equals方法
引用类型:
== 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价。

2.hashCode方法
等价的对象hashcode一致,但是hashCode一致的情况下,对象不一定等价

3.浅拷贝和深拷贝
浅拷贝:拷贝对象和原始对象引用类型引用同一个对象
深拷贝:拷贝对象和原始对象的引用类型引用不同对象。

关键字

final
对于数据
1.对于基本类型,final 使数值不变;
2.对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。

对于方法
声明方法不能被子类重写。 private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
对于类
声明类不允许被继承。

static

  1. 静态变量 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。
  2. 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。

静态方法:静态方法在类加载的时候就实现了,它不需要依赖任何的示例;静态方法必须有实现,不能是抽象方法
静态方法中只能访问属于类的静态字段或者静态方法,方法中不能有this和super关键字

静态语句块:
在类初始话的时候运行一次

静态内部类:
非静态内部类依赖于外部类的实例,但是静态内部类不需要

反射

类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName(“com.mysql.jdbc.Driver”) 这种方式来控制类的加载,该方法会返回一个 Class 对象。

java.lang.reflect 类库主要包含了以下三个类:
Field : 可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
Method : 可以使用 invoke() 方法调用与 Method 对象关联的方法;
Constructor : 可以用 Constructor 创建新的对象。

Java 与 C++ 的区别

Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object
C++ 为了兼容 C 即支持面向对象也支持面向过程。
Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
Java 支持自动垃圾回收,而 C++ 需要手动回收。
Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。
Java 不支持操作符重载,虽然可以对两个 String 对象支持加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。
Java 不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重学java—基础知识点 的相关文章

随机推荐