您的位置:首页 > 其它

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

2011-12-17 01:53 197 查看
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意味着成为了太监,哈哈。。

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: