关于继承,重载,重写,覆盖,final

 


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值