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意味着成为了太监,哈哈。。
  
 }