static 能够修饰什么:成员变量、成员方法、静态块;编程
final 能够修饰什么:成员变量、成员方法、类;数组
1、final关键字能够用来修饰类、方法、变量。各有不一样。多线程
A、修饰类(class)。
一、该类不能被继承。
二、类中的方法不会被覆盖,所以默认都是final的。
三、用途:设计类时,若是该类不须要有子类,没必要要被扩展,类的实现细节不容许被改变,那么就设计成final类模块化
B、修饰方法(method)
一、该方法能够被继承,可是不能被覆盖。
二、用途:一个类不容许子类覆盖该方法,则用final来修饰
三、好处:能够防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提升了执行效率。
四、注意:父类中的private成员方法不能被子类覆盖,所以,private方法默认是final型的(能够查看编译后的class文件)spa
C、修饰变量(variable)
一、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
二、特色:能够先声明,不给初值,这种叫作final空白。可是使用前必须被初始化。一旦被赋值,将不能再被改变。线程
D、修饰参数(arguments)
一、用final修饰参数时,能够读取该参数,可是不能对其做出修改设计
2、final关键字不能用来抽象类和接口。指针
成员变量的修饰符:code
private:自身能够访问,同包子类不能继承,同包类不能访问;对象
默认:自身能够访问,同包子类能够继承,同包类能够访问;
protected:自身能够访问,同包子类能够继承,不一样包子类能够继承,同包类能够访问,其余类不能够访问;
public:不一样包子类能够继承,其余类能够访问;
public > protected > default > private
public 指定该变量为公共的,他能够被任何对象的方法访问。
private 指定该变量只容许本身的类的方法访问,其余任何类(包括子类)中的方法均不能访问。
protected 指定该变量能够被自身和子类访问。在子类中能够覆盖此变量。
(1.基本类型; 2.基本类型封装;3.String;4.非字符串变量)
equals()是Object类的方法;
(1) 若是是基本类型比较,那么只能用==来比较,用equals会编译错误,由于不是对象。int a = 3;
(2) 对于基本类型的包装类型,好比Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。Integer n1 = new Integer(30);
(2.5)对于String a = “a”; Integer b = 1;这种类型的特有对象建立方式,==的时候值是相同的。
(3)对于字符串变量来讲,使用“==”和“equals()”方法比较字符串时,其比较方法不一样。
“==”比较两个变量自己的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
String s1 = "123";
String s2 = "123";
String s4 = new String("123");
String s5 = new String("123");
s1==s2 true; s1.equals(s2) true;
s4==s5 false; s4.equals(s5) true;
s1==s4 false; s1.equals(s4) true;
s1/s2分别指向字符串常量"123"建立的对象,在常量池里只有一个对象,内容为"123";
s4/s5两个引用对象指向的对象内容相同,可是new操做符建立的,内存中分配两块空间给这两个对象,因此内存地址不一样。
(4)对于非字符串变量来讲,"=="和"equals"方法的做用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
基本类型有八种:
整型4种:byte/short/int/long 字节数:1/2/4/8
字符型1种:char 2
浮点型2种:float/double 4/8
布尔型1种:boolean 1/8(八分之一字节)
一个字节等于8位,等于256个数,就是-128到127
大写的B表示Bytes=字节;小写的b表示bit=位;1byte=8bit;
自动转换:(小可转大,大转小会失去精度)
byte -> short/char -> int -> long -> float -> double
Error和Exception都实现了Throwable接口
Error指的是JVM层面的错误,好比内存不足OutOfMemoryError;
Exception 指的是代码逻辑的异常,好比下标越界OutOfIndexException;
Exception分为可查异常CheckedException和运行时异常RuntimeException:
可查异常是必须处理的异常,要么try catch住,要么往外抛,谁调用,谁处理,好比 FileNotFoundException、IOException、SQLException等。若是不处理,编译器就不让你经过。
运行时异常 又叫作非可查异常,在编译过程当中,不要求必须进行显示捕捉。
常见的Runtime Excepiton?
NullPointerException 空指针异常
ArithmeticException 算术异常,好比除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
IndexOutOfBoundsException 数组下标越界异常
NegativeArraySizeException 为数组分配的空间是负数异常
为何分两种异常?
Java之因此会设计运行时异常的缘由之一,是由于下标越界,空指针这些运行时异常太过于广泛,若是都须要进行捕捉,代码的可读性就会变得很糟糕。
9种;(简要介绍各方法)
1.对象的复制/获取/String/释放:clone/getClass/toString/finalize;
2.hash:equals/hashCode;
3.多线程:wait/notify/notifyAll
clone:实现对象的浅复制;
getClass:得到运行时类对象;
finalize:用于释放资源;
equals:比较对象是否相等;基本类型不能够用equals,对于String类型“equals”和“==”做用不一样;
hashcode:用于hash寻找;
wait:使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具备该对象的锁;wait()方法一直等待,直到得到锁或者被中断。wait(longtimeout)设定一个超时间隔,若是在规定时间内没有得到锁就返回。
调用该方法后当前线程进入睡眠状态,直到如下事件发生:
(1)其余线程调用了该对象的notify方法。
(2)其余线程调用了该对象的notifyAll方法。
(3)其余线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就能够被调度了,若是是被中断的话就抛出一个InterruptedException异常。
notify:唤醒在该对象上等待的某个线程
static{} > {} > className{} > method(){}
静态代码块>匿名方法块>构造方法>普通方法。