一、final、statichtml
final修饰类,类不能被继承java
final修饰方法,禁止该方法在子类中被覆盖 把该方法锁定。dom
final修饰变量,经常使用,其数值一旦被初始化不能再修改。若是是引用类型的变量,初始化后便不能再指向另外一个对象。jvm
当用final做用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只须要保证在使用以前被初始化赋值便可)必须在定义时或者构造器中进行初始化赋值,并且final变量一旦被初始化赋值以后,就不能再被赋值了。函数
引用变量被final修饰以后,虽然不能再指向其余对象,可是它指向的对象的内容是可变的。优化
public class Test { public static void main(String[] args) { final MyClass myClass = new MyClass(); System.out.println(++myClass.i); } } class MyClass { public int i = 0; }
输出1spa
final使用场景htm
在方法参数前面加final关键字就是为了防止数据在方法体中被修改。这里主要分两种状况:第一,用final修饰基本数据类型;第二,用final修饰引用类型。
第一种状况,修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被从新赋值。不然编译就通不过。例如:
public void testInt(final int param1) {
param1 = 100;
}
在方法体内修改了基本数据类型变量的值,在Eclipse中则会提示:“ The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.“
第二种状况,修饰引用类型。这时参数变量所引用的对象是不能被改变的。做为引用的拷贝,参数在方法体里面不能再引用新的对象。不然编译通不过。例如:
public void testFinal2(final Object param2) {
param2 = new Object();
}
在方法体内修改了参数的引用,在Eclipse中则会提示:“ The final local variable param2 cannot be assigned. It must be blank and not using a compound assignment.“
static对象
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的全部实例共享同一个static变量。
public class Test { public static void main(String[] args) { MyClass myClass1 = new MyClass(); MyClass myClass2 = new MyClass(); System.out.println(myClass1.i); System.out.println(myClass1.j); System.out.println(myClass2.i); System.out.println(myClass2.j); } } class MyClass { public final double i = Math.random(); public static double j = Math.random();
输出结果:blog
0.08514268139173864
0.4449156699153448
0.86659777969746
0.4449156699153448
由于j是static修饰的变量,一个类只有一份,故不变
匿名内部类中使用的外部局部变量为何只能是final变量? 见 http://www.cnblogs.com/dolphin0520/p/3811445.html
public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); } }
第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,若是在编译期间能知道它的确切值,则编译器会把它当作编译期常量使用。也就是说在用到该final变量的地方,至关于直接访问的这个常量,不须要在运行时肯定。这种和C语言中的宏替换有点像。所以在上面的一段代码中,因为变量b被final修饰,所以会被当作编译器常量,因此在使用到b的地方会直接将变量b 替换为它的 值。而对于变量d的访问却须要在运行时经过连接来进行。想必其中的区别你们应该明白了,不过要注意,只有在编译期间能确切知道final变量值的状况下,编译器才会进行这样的优化,好比下面的这段代码就不会进行优化:
三、java中==、equals区别
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,因此,除非是同一个new出来的对象,他们的比较后的结果为true,不然比较后结果为false。JAVA当中全部的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而再也不是比较类在堆内存中的存放地址了。 对于复合数据类型之间进行equals比较,在没有覆写equals方法的状况下,他们之间的比较仍是基于他们在内存中的存放位置的地址值的,由于Object的equals方法也是用双等号(==)进行比较的,因此比较后的结果跟双等号(==)的结果相同。
四、java中String类型
public class TestString { public static void main(String[] args) { String s1 ="Monday"; String s2 =new String("Monday"); if (s1 == s2) {System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } }
String字符串缓冲池中,
java 中String是 immutable的,也就是不可变,一旦初始化,引用指向的内容是不可变的(注意:是内容不可变)。
原来,程序在运行的时候会建立一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是建立字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,因此在s2被建立的时候,程序找到了具备相同值的 s1 将s2引用s1所引用的对象"Monday" 第二段程序中,使用了 new 操做符,他明白的告诉程序:"我要一个新的!不要旧的!"因而一个新的"Monday"Sting对象被建立在内存中。他们的值相同,可是位置不一样,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是同样的非要分开作什么呢?
java中String == 和equal区别 https://www.cnblogs.com/studyLog-share/p/5307913.html
二、public、private、protected
在说明这四个关键字以前,我想就class之间的关系作一个简单的定义,对于继承本身的class,base class能够认为他们都是本身的子女,而对于和本身一个目录下的classes,认为都是本身的朋友。一、public:public代表该数据成员、成员函数是对全部用户开放的,全部用户均可以直接进行调用二、private:private表示私有,私有的意思就是除了class本身以外,任何人都不能够直接使用,私有财产神圣不可侵犯嘛,即使是子女,朋友,都不可使用。三、protected:protected对于子女、朋友来讲,就是public的,能够自由使用,没有任何限制,而对于其余的外部class,protected就变成private。做用域 当前类 同一package 子孙类 其余packagepublic √ √ √ √protected √ √ √ ×friendly √ √ × ×private √ × × ×注:不写时默认为friendly