final:
1.修饰:非抽象类、非抽象类成员方法、变量
2.类是final的,方法也是final的,没有子类
方法是final的,可以被子类调用,不能被重写,不能修饰构造方法
变量是final的,静态变量、实例变量和局部变量,只能被赋值一次
Note:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的
Code:
1.final类
(父)
public final class TestFinalFather {
public final void Methold(){}
}
(子)
public final class TestFinalSon extends TestFinalFather{//*不能被继承
<span style="white-space:pre"> </span>
}
报错
Note:不能被继承
2.final方法
(父)
public class TestFinalFather {
<span style="white-space:pre"> </span>public final void Methold1(){}
<span style="white-space:pre"> </span>public void Methold2(){}
<span style="white-space:pre"> </span>private void Methold3(){}
}
(子)
</pre><pre name="code" class="java">public final class TestFinalSon extends TestFinalFather{
public final TestFinalSon(){//不能修饰构造方法
}
public void Methold1(){}//*不能被子类的方法覆盖
public void Methold2(){}
public static void main(String args[]){
TestFinalSon ts=new TestFinalSon();
ts.Methold1();
ts.Methold2();
ts.Methold3();//*final方法可以被子类调用,但是private方法不能被子类调用
}
}
(报错)
Note:不能修饰构造方法
Note:不能被子类的方法覆盖
Note: final方法可以被子类调用,但是private方法不能被子类调用
3.final变量
public class TestFinalFather {
public String args0;
public final String args1;//可以先声明,而不给初值
public final String args2="wwww";
public TestFinalFather(String x) {
args1 = x; //赋值
}
public static void main(String []args){
TestFinalFather ts= new TestFinalFather("1");
ts.args0="www";
ts.args1="www";//*
ts.args2="www";//*
System.out.println(ts.args0);
}
}
(报错)
Note:final类必须初始化,但可以先申明,再初始化
Note:一旦给final变量初值后,值就不能再改变了
深入解析final对象
<pre name="code" class="java"><pre name="code" class="java">public class TestFinal {
public static void main(String [] args){
//基本类型
Integer a1=3;
int a=3;
Integer b1=4;
int b=4;
Integer c1=a1+1;
int c=a+1;
//String类型
String Test="aaa";
// public String TestPublic="aa";
String argString="aa";
String argStringTest="aa";
final String argFinal="aa";
String TestString=argString+"a";
String TestFinal=argFinal+"a";
//对象类型
TestFinal tF= new TestFinal();
TestFinal tF2=new TestFinal();
final TestFinal tF1= new TestFinal();
TestClass tC= new TestClass();
System.out.println(b1==c1);//值的比较
System.out.println(b==c);//值的比较
System.out.println(argString==argFinal);//地址比较 true
System.out.println(argStringTest==argString);//地址比较 true
System.out.println(TestString==Test);//"+"
System.out.println(TestFinal==Test);//"+"
System.out.println(TestFinal.equals(Test));
System.out.println(TestString.equals(Test));
System.out.println(tF==tF2);
System.out.println(tF.equals(tF2));
tF2=tF;
// tF1=tF;//*不能改变final类型所指的对象,可以改变对象的内容(属性)
}
}
http://www.cnblogs.com/dolphin0520/p/3736238.html
Note:"=="和equals没区别,但是String对equals方法进行了重写
一般"=="比较的是对象的地址