昨天是我第一天在写下我最近一年的状态,现在开始每天只能记录我一天的状态了,就没有那么多废话了。
1.面向对象的特性
1.继承:继承是从已有类得到继承的信息创建新类的过程。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
2.封装:封装就是隐藏一切可隐藏的东西(如数据和操作数据),只向外界提供简单的编程接口。
3.多态性:多态性是指允许不同子类型的对象对同一消息做出不同的相应。简单地说就是用同样的对象引用调用同样的方法但是做了不同的事情。方法重载实现的是编译时的多态性,方法重写实现的是运行时的多态性。
4.抽象:抽象是将一类对象的共同特征总结出来构造类的过程。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2.访问权限修饰符
1.private:只能在当前类中访问。
2.default(默认不写):可以在同包下访问。
3.protected:可以在子类中访问。
4.public:可以在其他包中访问。
3.Java有没有goto语句
goto是Java的保留字,目前的版本中没有使用。Java的保留字有goto和const。
4.&和&&的区别
1.&运算符有两种用法:(1)按位与;(2)逻辑与。
2.&&运算符是短路与运算。如果&&左边的表达式的值是false,右边的表达式会直接被短路掉,不会进行运算。
5.两个对象值相同(x.equals(y) == true),但却有不同的hashCode,这句话对不对?
不对,Java对于equals方法和hashCode方法是这样规定的:
1.如果两个对象相同(equals方法返回true),那么它们的hashCode也一定相同。
2.如果两个对象的hashCode相同,它们并不一定相同。
6.方法重写(overload)和方法重载(override)的区别
方法重载的规则:
1.方法名相同,参数列表中参数的顺序,类型,个数不同。
2.重载与方法的返回值无关,存在于父类和子类,同类中。
3.可以抛出不同的异常,可以有不同的修饰符。
方法重写的规则:
1.参数列表必须完全与被重写的方法一致,返回值类型必须完全与被重写方法的返回值类型一致。
2.构造方法不能被重写,声明为final的方法不能被重写,声明为static的方法不能被重写,但是能够被再次声明。
3.访问权限不能比父类中被重写的方法的访问权限更低。
4.重写的方法能够抛出任何非运行时异常,重写不能跑出新的异常。
7.char类型的变量能不能存储一个中文汉字?
可以,因为Java中使用的是Unicode编码,一个char类型占2个字节,所以可以存放。
8.抽象类(abstract class)和接口(interface)有什么异同?
相同点:
1.都不能被实例化。
2.可以将抽象类和接口类型作为引用类型。
3.一个类如果继承了某个抽象类或实现了某个接口都要对其中的抽象方法全部进行实现,否则该类需被声明为抽象类。
不同点:
1.抽象类中可以定义构造器,而接口不行。
2.抽象类中可以有抽象方法和具体方法,但是接口中只允许有抽象方法。
3.抽象类中的成员可用所有的修饰符修饰,而接口中的成员只能用public修饰。
4.抽象类中可以定义成员变量,而接口定义的成员变量实际都是常量(用public static final修饰)。
5.有抽象方法的类必须声明为抽象类,而抽象类未必有抽象方法。
6.抽象类中可以包含静态方法,而接口不可以。
7.一个类只能继承一个抽象类,但是可以实现多个接口。
9.break和continue的区别
相同点:break和continue都是用来控制循环的语句。
不同点:break用于直接跳出跳出循环,直接跳出循环体执行后面的语句,而continue是用来跳出当前循环,继续执行下一次循环。
10.Error和Exception的区别
Error类和Exception类的父类都是Throwable类。
区别:Error类一般是指与虚拟机有关的问题,如系统崩溃,虚拟机错误,内存不足,栈溢出等。Exception类表示程序可以处理的异常,可以捕获且可能恢复。
11.常见的RuntimeException
1.NullPointerException:空指针异常。
2.ClassNotFoundException:指定的类找不到异常。
3.IndexOutOfBoundsException:数组索引越界异常。
4.ClassCastException:数据类型转换异常。
5.SQLException:Sql操作异常。
12.final,finally,finalize的区别
1.final:用于声明属性,方法和类,分别表示属性不可变,方法不可重写,被其修饰的类不可继承。
2.finally:异常处理语句结构的一部分,表示总是执行(一般用来释放资源)。
3.finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法。(该方法是一个被动的方法,不需要我们调用。)
13.switch可以作用在哪些基本数据类型?
JDK1.5以前switch(expr)中,expr只能是byte、short、int和char。在JDK1.5之后,Java中引入了枚举类型(enumeration),expr也可以是enum类型。JDK1.8之后,expr还可以是字符串(String),但是long(长整型)在目前所有版本中都是不支持的。
14.死锁产生的四个必要条件
死锁是指多个线程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将停滞不前。
1.互斥条件:在同一时间内,某资源只被一个线程所占有。
2.不剥夺条件:线程所获取的资源在未使用完毕之前,不能被其他线程强行夺走,只能自己主动释放。
3.请求和保持条件:线程已经保持了至少一个资源,又提出了新的资源请求,而该资源已被其他线程所占有,此时请求被阻塞,但对自己已经获得的资源保持不放。
4.循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。
15.进程和线程的区别
进程:是操作系统进行资源分配和调度的一个独立单位。
线程:是进程的一个实体,是cpu调度和分配的基本单位,是比进程更小的可以独立运行的基本单位。
实际中进程就相当于一个软件,而线程相当于这个软件的各个功能(前提是这些功能可以同时使用,如360管家同时进行垃圾清理和杀毒)。
16.同步线程及线程调度相关的方法
1. wait:使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁。
2. sleep:使一个正在运行的线程处于睡眠状态,是一个静态方法。
3. notify:唤醒一个处于等待状态的线程,不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒那个线程,而且与优先级相关。
4. notifyAll:唤醒所有处于等待状态的线程,,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态。
17.获取字节码的方式
1. Class.forName(className)
2. 类名.class
3. this.getClass()
18.单例模式
单例模式分为饿汉式和懒汉式
饿汉式:一出来就创建
public class Singleton{
//直接创建对象
private static Singleton instance = new Singleton();
//私有化构造参数
private Singleton(){
};
//返回对象实例
public static Singleton getInstance(){
return instance;
}
}
饱汉式:需要才创建
public class Singleton{
//声明变量
private static Singleton instance;
//私有化构造参数
private Singleton(){
};
//提供对外方法
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}