java基础(一)

Java基础

一、 String

  • String不可变,因此是线程安全的

  • StringBuilder不是线程安全的

  • StringBuffer是线程安全的,内部使用synchronized进行同步

  • new String(“abc”)

    • 使⽤这种⽅式⼀共会创建两个字符串对象(前提是 String Pool 中还没有 “abc” 字符串对象)。

    • “abc” 属于字符串字⾯量,因此编译时期会在 String Pool 中创建⼀个字符串对象,指向这个 “abc”

      字符串字⾯量;

    • ⽽使⽤ new 的⽅式会在堆中创建⼀个字符串对象。

二、final

1、数据

声明数据为常量,可以是编译时常量,也可以是在运⾏时被初始化后不能被改变的常量。

  • 对于基本类型,final 使数值不变;
  • 对于引用类型,final使引用不变,也就不能引用其他对象,但是被引用的对象本身是可以修改的

2、方法

声明方法不能被子类重写

private方法隐式地被指定为final,如果在⼦类中定义的⽅法和基类中的⼀个 private ⽅法签名相同,此

时⼦类的⽅法不是重写基类⽅法,⽽是在⼦类中定义了⼀个新的⽅法。

三、static

1、静态变量

  • 静态变量:⼜称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接

    通过类名来访问它。静态变量在内存中只存在⼀份。

  • 实例变量:每创建⼀个实例就会产⽣⼀个实例变量,它与该实例同⽣共死。

2、静态方法

  • 静态方法在类加载的时候就存在了,他不依赖于任何实例,所以静态方法必须有实现,也就是它不能是抽象方法。

  • 只能访问所属类的静态字段和静态⽅法,⽅法中不能有 this 和 super 关键字,因此这两个关键字与具体对象关联。

3、静态语句块

  • 静态语句块在类初始化时运⾏⼀次。

4、静态内部类

  • ⾮静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能⽤这个实例去创建⾮静态内部类。⽽静态内部类不需要。
  • 静态内部类不能访问外部类的⾮静态的变量和⽅法。

5、初始化顺序

  • 静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序

四、 equals()

1、等价与相等

  • 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() ⽅法。
  • 对于引⽤类型,== 判断两个变量是否引⽤同⼀个对象,⽽ equals() 判断引⽤的对象是否等价。

2、面试题:请解释字符串比较之中“==”和equals()的区别?

  • ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
  • equals():比较的是两个字符串的内容,属于内容比较。

五、 hashCode()

  • hashCode() 返回哈希值,⽽ equals() 是⽤来判断两个对象是否等价。等价的两个对象散列值⼀定相

    同,但是散列值相同的两个对象不⼀定等价,这是因为计算哈希值具有随机性,两个值不同的对象可能

    计算出相同的哈希值。

  • 在覆盖 equals() ⽅法时应当总是覆盖 hashCode() ⽅法,保证等价的两个对象哈希值也相等。

  • HashSet 和 HashMap 等集合类使⽤了 hashCode() ⽅法来计算对象应该存储的位置,因此要将对象添

    加到这些集合类中,需要让对应的类实现 hashCode() ⽅法。

六、 重写与重载

1、重写(Override)

存在于继承体系中,指⼦类实现了⼀个与⽗类在⽅法声明上完全相同的⼀个⽅法。

为了满⾜⾥式替换原则,重写有以下三个限制:

  • ⼦类⽅法的访问权限必须⼤于等于⽗类⽅法;
  • ⼦类⽅法的返回类型必须是⽗类⽅法返回类型或为其⼦类型。
  • ⼦类⽅法抛出的异常类型必须是⽗类抛出异常类型或为其⼦类型。

使⽤ @Override 注解,可以让编译器帮忙检查是否满⾜上⾯的三个限制条件。

2、重载(Overload)

存在于同⼀个类中,指⼀个⽅法与已经存在的⽅法名称上相同,但是参数类型、个数、顺序⾄少有⼀个

不同。

应该注意的是,返回值不同,其它都相同不算是重载。

七、 反射

每个类都有⼀个 Class 对象,包含了与类有关的信息。当编译⼀个新类时,会产⽣⼀个同名的 .class⽂件,该⽂件内容保存着 Class 对象。

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

反射可以提供运⾏时的类信息,并且这个类可以在运⾏时才加载进来,甚⾄在编译时期该类的 .class 不存在也可以加载进来。

Class 和 java.lang.reflect ⼀起对反射提供了⽀持,java.lang.reflect 类库主要包含了以下三个类:

  • Field :可以使⽤ get() 和 set() ⽅法读取和修改 Field 对象关联的字段;
  • Method :可以使⽤ invoke() ⽅法调⽤与 Method 对象关联的⽅法;
  • Constructor :可以⽤ Constructor 的 newInstance() 创建新的对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsken丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值