>整理一下以前的Java学习笔记,查缺补漏
#### this和super的区别
区别|this|super
:--|:--|:--
定义|表示本类对象|表示父类对象
使用|本类操作:<br/>this.属性<br/>this.方法()<br/>this()|父类操作<br/>super.属性<br/>super.方法()<br/>super()
调用构造|调用本类构造<br/>要放在首行|子类调用父类构造<br/>要放在首行
查找范围|先从本类查找<br/>找不到再查父类|直接由子类查找父类
特殊|表示当前对象|-
#### 方法重载和覆写的区别
区别|重载(Overloading)|重写(Overriding)
:--|:--|:--
定义|方法名称相同,参数的类型及个数不同|方法名称、参数类型及个数、返回值类型完全相同
权限|没有权限要求|被子类所覆写的方法不能拥有比父类更严格的访问控制权限
范围|发生在一个类中|发生在继承关系类中
#### 抽象类和接口的区别
区别|抽象类|接口
:--|:--|:--
关键字|abstrac class|interface
组成|常量、变量、抽象方法、普通方法、构造方法|全局常量、抽象方法
权限|可以使用各种权限|只能是public
关系|一个抽象类可以实现多个接口|接口不能继承抽象类,却可以继承多个接口
使用|①子类使用extends继续抽象类<br/>②抽象类和接口的对象多态性的向上转型发,进行接口或者抽象类的实例化操作(公共)|①子类使用implements实现接口
设计模式|模板设计模式|工厂设计模式、代理设计模式
局限|一个子类只能继承一个抽象类|一个子类可以实现多个接口
1. 接口的默认方法是public,方法不能有实现(Java8开始接口可以有静态方法和默认方法),抽象类可以有非抽象的方法
2. 接口除了static、final变量不能有其他变量,抽象类可以有其他变量
3. 一个类可以实现多个接口,只能实现一个抽象类;接口可以通过extends关键字扩展其他接口
4. 接口的默认修饰符是public,抽象类可以有public, protected, default等修饰符,抽象类为了能被重写,不能使用private修饰符
##### 抽象类
抽象类的最大特点是包含了抽象方法,抽象方法是声明而未实现的方法(没有方法体)。抽象方法要用abstract关键字完成,并且抽象方法要在抽象类中,抽象类要用abstract声明
```
abstract class A {
private String info = "Hello";
public void print() {
System.out.print(info);
}
public abstract get();
}
```
实际开发中抽象类的使用原则:
1. 抽象类必须要有子类,必须使用extends继承,一个子类只能继承一个抽象类
2. 子类必须覆写抽象类的全部抽象方法
3. 抽象类对象可以使用对象的向上转型方式,通过子类来进行实例化的操作
##### 接口
一个全部由抽象方法和全局变量组成的类,成为接口。使用interface进行定义、
使用原则:
1. 每个接口必须定义子类,子类使用implements关键字实现接口
2. 接口的子类必须覆写接口中所定义的全部抽象方法
3. 利用接口子类,采用对象的向上转型方式,进行接口对象的实例化操作
```
public abstract interface A {
public abstract String get();
}
// 使用过程中可以简写为:
public interface A {
String get();
}
```
在Java中,每个抽象类可以实现多个接口,一个接口却不能继承抽象类,但是一个接口可以同时继续多个接口,以实现接口的多继承操作
#### Thread类和Runnable接口实现多线程的区别
① 多线程的两种实现方式都需要一个线程的主类,而这个类可以实现Runnable接口或继承Thread类。不管是使用何种方式都必须在子类中覆写run()方法,此方法为线程的主方法。
②Thread类是Runnable接口的子类,使用Runnable接口可以避免单继承的局限,以更加方便的实现数据共享概念。
程序实现结构:
- Runnable接口
```
public class MyThread implements Runnable {
@Override
public void run() {
// TODO
}
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt).start();
}
}
```
- Thread类
```
public class MyThread extends Thread {
@Override
public void run() {
// TODO
}
public static viod main(String[] args) {
MyThread mt = new MyThread();
mt.start();
}
}
```
#### sleep()和wait()的区别
1. sleep()是Thread类定义的static方法,表示线程休眠,将执行机会给其他线程,但是监控状态依然保持,到时会自动恢复。
2. wait()是Object类定义的方法,表示线程等待,一直到执行了notify()方法或notifyAll()后才结束等待。
#### final, finally, finalize的区别
1. final表示终结器,用于不能定义被继续的类
- 关于final修饰符
1. 如果一个类被声明为final,意味着它不能再派生新的子类,它不能作为父类被继承。一个类不能既被声明为abstract,又被声明为final
2. 将变量或方法声明为final,表示在使用中不被改变7
2. finally是异常处理的出口
3. finalize()是object类定义的一个方法,用于执行对象回收前的收尾操作
#### Comparable比较器和Comparator比较器的区别
1. java.lang.Comparable是一个类在定义时默认是实现的接口,里面只有一个compareTo()方法
2. java.util.Comparator是需要单独定义一个比较的规则类,里面有两个方法,compare()和equal()
#### 字节流和字符流的区别
1. 字符流没有使用缓冲区,而字节流使用了缓冲区
2. 处理各种数据都可以通过字节流完成,而在处理中文时使用字符流会更好
#### Java序列化的作用以及实现
序列化操作的主要目的是为了保证对象以二进制数据的方式进行传输,如果要想实现序列化,对象所在的类必须实现java.io.Serializable接口,默认情况下一个对象的所有属性都会被序列化下来,也可以使用transient关键字定义不被序列化的属性。
#### ArrayList和Vector的区别
ArrayList和Vector都是List接口的子类,区别在于:
区别|ArrayList|Vector
:--|:--|:--
推出时间|JDK1.2|JDK1.0
性能|采用异步处理方式,性能更高|采用同步处理方式,性能相对较低
安全性|非线程安全|线程安全
输出|Iterator, ListIterator, foreach|Iterator, ListIterator, foreach, Enumeration
开发中首选ArrayList
#### HashMap和HashTable的区别
HashMap和HashTable都属于Map接口的子类,区别如下:
区别|HashMap|HashTable
:--|:--|:--
推出时间|JDK1.2|JDK1.0
性能|采用异步处理方式,性能更高|采用同步处理方式,性能相对较低
安全性|非线程安全|线程安全
设置null|允许将key或value设置为null|不允许出现null,否则出现空指针异常
#### String类的两种对象实例化方式的区别
1. 直接赋值:只开辟一块内存空间,字符串的内容可以自动入池,以便下次使用
```
String s = "Hello";
```
2. 构造方法:开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,需要使用intern()手工入池
```
String s = new String("Hello");
创造了两个实例化对象,
一个是String类的匿名对象,
一个是使用关键字new实例化的String对象
```
#### Error和Exception的区别
1. Error是指JVM错误,这个程序并没有执行,无法处理
2. Exception指的是程序中出现的错误信息,可以进行异常处理
#### String.valueOf()和Integer.toString()的区别
1. valueOf()对null值进行处理不会有任何异常,当object为null时,返回字符串“null”
2. toString()对任何严格意义上的java对象必须保证object不是null值,否则将抛出空指针异常(NullPointerException)
#### volatile 特性
1. 可见性:对一个volatile变量的读,总是能看到(任何线程)对这个变量最后的写入
2. 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++ 这种集合操作不具有原子性
#### volatile和synchronized关键字
1. volatile可以用来修饰字段(成员变量),就是告诉程序任何对改变量的访问均需要从共享内存获取,而它的改变必须同步刷新到共享内存,它能保证所有线程对变量访问的可见性。
2. synchronized可以修饰方法或者以同步块形式来进行使用,它主要确保多个线程在同一时刻,只有一个线程处于方法或同步块中,它保证了线程对变量访问的可见性和排他性。
-4e371e609f73419cb793fa47a576b12c.jpg)
学习笔记-Java基础