黑马程序员-关于类的继承问题与final关键字的一些感悟

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

在面向对象的语言中,类的继承无疑给编程带来更高的效率,所谓继承就是在定义新的类时,在已有类的基础上再定义些新的成员变量,只需通过extends继承原有类的方法和变量,原有的类我们就叫父类,新的类叫做子类。在java,关于类的继承有它自己特有的规则,本人在此做个小小的总结吧。

 1,java不支持多重继承,也就是说子类至多只能有一个父类,简单地讲打个比方,a是子类它的父类如果是b,则不会再有其它的父类。就像一个儿子只能有一个生你的爸爸一样。

2,可以多层继承,形象点讲就是A继承了B,B继承了C,那么A间接就继承了C。

3,子类中继承父类中非私有的成员变量和成员方法,但不继承构造方法,如果子类想继承父类的构造方法可以用super()来调用。

4,子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。

5,子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。其实这个时候这个父类的方法被覆盖了。这个时候若想再调用父类中那个被覆盖的方法可以用super关键字。这里多说一句,覆盖父类中方法时,子类中的方法的访问权限不能比父类更严格。

现在来讲一下final关键字。

首先要说明的是在java中对类,方法,变量的声明都可以用final来修饰的。

1,类中的应用。

final修饰的类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。我们在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会被扩展,那么我们就可以加final关键字来修饰。

2,变量的应用

 用final修饰的成员变量表示常量,而且只能赋值一次!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。一旦给final变量赋初值后,值就不能再改变了。另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为空白final,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,空白final在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同, 却有保持其恒定不变的特征。

3,方法中的应用

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。也就是说,final修饰的方法不能被子类重写。方法中定义的内置类只能访问该方法内的final类型的局部变量。

使用final方法的原因有二:

第一、把方法锁定,防止任何继承类修改它的意义和实现。

第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

例如:

public class  Test1 {

public static  void main(String[] args) {

}

public void  f1() {

System.out.println("f1 ");

}

}

//无法被子类覆盖的方法

public final void f2() {

System.out.println("f2");

}

public void f3() {

System.out.println("f3"); }

private void  f4() {

System.out.println("f4 ");

}

}

public class Test2 extends  Test1 {

public void f1(){

System.out.println(" Test1父类方法f1被覆盖!" );

}

public static void main(String[] args) {

Test2 t = newTest2();

t.f1();

t.f2();

//调用从父类继承过来的final方法

t.f3();

//调用从父类继承过来的方法

//t.f4();

//调用失败,无法从父类继承获得

}

4,在参数中的应用

我们可以将形参用final来修饰,但这样我们就无法在方法中修改它了。例如:

public class  Test2{

public static void  main(String[] args) {

newTest1().f1(1);

}

public void f1( final int i)

{

//i++;    i是final类型的,值不允许改变的.

System.out.print(i);

    }

以上算是对final关键字和类的继承一些简单的感悟吧。

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值