package com.中行网安;
/**
* 下午9:01:50 2011-12-16 @author=wangtao
*/ /**
*
* @author wangtao
*
* 上午12:46:47 -2011-12-17
*
* final
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
1、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
*
*
*
*/public class ZhongXingWangAn {
public final int i = 0;
public final int i2 = 1;//final 类型变量没有初始化,下面的构造方法会报错!!!
public ZhongXingWangAn() {//构造方法默认为final类型
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
Dad dad = new Dad();
Son son = new Son();
//son = (Son) dad;//这句竟然报Dad cannot be cast to Son
//son.instanceFeature();
dad = son;
Object object = dad;
dad.staticFeature();//父类方法不能被覆盖,输出父类中的I am a man !
dad.instanceFeature();//这叫覆盖,即父类方法被覆盖,输出子类中的I am brave too !------------son
//总结:父类方法中静态方法不会被覆盖,而实力方法会被覆盖。
son.testFinal();//
System.out.println(son.testFinalParam(2));
}
private static void testStatic() {
// TODO Auto-generated method stub
System.out.println("I am a static method !");
}
}
class Dad {
String name = "dad";
int age = 46;
public Dad() {//注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
// TODO Auto-generated constructor stub
}
public static void staticFeature(){
System.out.println("I am a man !");
}
public void instanceFeature(){
System.out.println("I am brave !");
}
public final void testFinal(){
System.out.println("I am final method !");
}
public int testFinalParam(final int i){
//i++;不允许操作
return i;
}
}
class Son extends Dad{//Son的所有方法默认为final
public Son(){
}
//@Override为什么静态方法不能加上重写的标记呢?
public static void staticFeature(){//这叫重写
System.out.println("I am a man too!----------son");
}
@Override
public void instanceFeature() {//疑惑了好一会,原来是类方法不能被重写。思考:为什么类方法不能被重写呢?
// TODO Auto-generated method stub
// super.instanceFeature();
System.out.println("I am brave too !------------son");
}
public void staticFeature(int i){//这叫重载
}
// public final void testFinal(){//final方法不能被覆盖,但是可以被继承,例如直接用Son对象调用父类中的final方法可以用
// System.out.println("I am final method !");
// }
// public int staticFeature(){//若只有返回类型不同,则不能重载,编译报错。
//
// }
public static void testStatic (){
staticFeature();//静态方法中直接调用父类或本类中静态方法。
new Son().staticFeature();//静态方法中用实例化对象调用父类或本类中静态方法,会有提醒警告,但是可以用,不推荐这样做。
//instanceFeature();//静态方法中直接调用实例化方法,编译错误。
new Son().instanceFeature();//静态方法中 "必须" 用对象调用父类或本类中的实例方法
}
public void testInstance(){
staticFeature();//实例方法中,不用创建对象可以直接调用父类或本类中的静态方法。
new Son().staticFeature();//实例方法中用对象调用父类或本身的静态方法,有提醒警告,不推荐这样做。
instanceFeature();//实例化方法中调用父类或本类的实例化方法,随便用。
new Son().instanceFeature();//实例化方法中用对象调用父类或本类中实例化方法,随便用。
}
//总结:除了静态方法中不能直接调用实例化方法外,其他都可编译通过。
//思考:为什么静态方法中可以直接调用静态方法,实例化方法中随便调用用呢?
}
class grandSon {//extends Son{//测试final类不能被继承,son已绝后,即son意味着成为了太监,哈哈。。
}