一、Object类方法详解
1. getClass 获取当前运行时对象的Class对象
例如:
public class Demo01 {
public static void main(String[] args) {
Object ob = new Object();
System.out.println(ob.getClass());
}
}
返回:
class java.lang.Object
2. hashCode 返回对象的hash码
例如:
public class Demo01 {
public static void main(String[] args) {
Object ob = new Object();
System.out.println(ob.hashCode());
}
}
返回:
1072591677
3. clone 拷贝当前对象
被拷贝对象的类,必须实现Cloneable接口。浅拷贝对基本类型进行值拷贝,对引用类型拷贝引用;深拷贝对进本对基本类型进行值拷贝,对引用类型对象不但拷贝对象的引用还拷贝对象的相关属性和方法。两者不同在于深拷贝创建了一个新的对象。
4. equals 通过内存地址比较两个对象是否相等,String重写了这个方法使用值来比较是否相等
==:
- 基本数据类型:比较数值是否相等
- 引用数据类型:比较的对象地址是否相等
equals:
equals的底层是==通过String重写了equals后使用值来进行比较
5. toString 返回类名@哈希码的16进制
例如:
public class Demo01 {
public static void main(String[] args) {
Object ob = new Object();
System.out.println(ob.toString());
}
}
返回:
java.lang.Object@3fee733d
6. notify 唤醒当前对象监视器的任意一个线程
7. notifyAll 唤醒当前对象监视器上的所有线程
8. wait 暂停线程的执行
三个不同参数方法(等待多少毫秒;额外等待多少毫秒;一直等待);与Thread.sleep(long time)相比,sleep使用当前线程休眠一段时间,并没用释放该对象的锁 ,wait释放了锁。
9. finalize 对象被垃圾回收器回收时执行的方法
二、java中的基本数据类型
- 整型:
- byte:1字节,8位
- short:2字节,16位
- int:4字节,32位
- long:8字节,64位
- 浮点型:
- float:4字节,32位
- double:8字节,64位
- 布尔型:boolean只有true和false
- 字符型:char 2字节,16位
三、String,StringBuffer,StringBuilder的区别
- String:由char[] 数组组成,使用了final修饰,是不可变对象,可以理解为常量,线程安全;对String进行改变是每次都会新生成一个新String对象,然后把指针指向新的引用对象。
- StringBuffer和StringBuilder都是字符串缓冲区,StringBuffer线程安全但是速度慢,StringBuilder线程不安全但是速度快。
- 操作少量字符串时用String;单线程操作大量数据用StringBuilder;多线程操作大量数据时用StringBuffer。
- StringBuffer慢是因为方法都用synchronized修饰了导致执行效率低。
四、面向对象三大特性
- 封装: 把一个对象的属性私有化,我们可以根据提供的访问方法来控制外界去访问指定的属性
- 继承: 是使用已存在的类作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过付父类我们能够非常方便的复用以前的代码。
- 一个子类只能继承一个父类,但是一个父类可以被多个子类继承。
- 子类可以拥有父类非private的属性和方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方法实现父类的方法。(重写)
- 多态: 父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的扩展性。在java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一个方法)。
隐藏的第四大特性:抽象
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
五、重载与重写
- 重载: 发生在同一个类中,方法名相同,参数的类型,个数,顺序不同,方法的返回值和修饰符可以不同。
public class User{
private String name;
private Integer age;
public void run(){
System.out.println("跑");
}
public void run(String name){
System.out.println(name + "在跑");
}
public void run(String name, Integer age){
System.out.println(age + "岁的" + name + "在跑");
}
}
- 重写: 发生在父子类中,方法名和参数相同,返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private或者final则子类就不能重写该方法。
继承上面的User类
public class Demo1 extends User{
@Override
public void run() {
System.out.println("奔跑");
}
}
六、final修饰符
- 修饰基本数据类型变量,一经出现初始化后就不能够对其进行修改。
- 修饰引用类型变量,不能够指向另一个引用。
- 修饰符或方法,不能被继承或重写。
七、抽象类和接口的区别
相同点
- 接口和抽象类都不能实例化
- 都位与继承的顶端,用于被其他实现或继承
- 都包含抽象方法,其子类都必须覆写这些抽象方法
不同点
参数 | 抽象类 | 接口 |
---|---|---|
声明 | 抽象类使用abstract关键字声明 | 接口使用interface关键字声明 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,他需要提供抽象类中的所有声明的方法和实现 | 子类使用implements关键字来实现接口。他需要提供接口中所有声明的方法实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
访问修饰符 | 抽象类中的方法可以是任意访问修饰符 | 接口方法默认修饰符是public。并且不允许定义为private或者protected |
多继承 | 一个类最多只能继承一个抽象类 | 一个类可以实现多个接口 |
字段声明 | 抽象类字段声明可以是任意的 | 接口的字段默认都是static和final的 |
八、值传递
- 值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。
- 引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
九、throw和throws的区别(异常)
throw是语句抛出一个异常。
语法:throw (异常对象);
throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{…}
public void doA(int a) throws Exception1,Exception3{…}
九、集合框架
**Collection:**可以用来存储一组不唯一(可重复),无序(存储时无顺序)的数据
**List:**可以用来存储一组不唯一,有序(存储时有顺序,先存的在前面,后存的在后面)的对象
**Set:**可以用来存储一组唯一,无序的对象
**Map:**存储的是键值对数据
ArrayList和LinkedList的区别:
相同点: 都是 List 接口的实现类,可以存储可重复的,有序的数据
不同点:
- ArrayList 底层数据结构是数组结构,在实现数据的查询时,因为数组结构有下标,所以效率较高。但是,在增加或删除数据时,因为数组结构长度不可变,所以会创建一个新的数组,导致效率较低。
它适合于查询较多,增删较少的情况。 - LinkedList 底层数据结构是链表结构,在增加或删除数据时,尤其是首尾的增删,因为链表结构增加节点或删除节点,只需要修改下一个连接的地址即可,效率较高。但是,在实现数据的查询时,没有下标,只能从首节点依次进行查询,效率较低。
它适合于增删较多,查询较少的情况。