`
thinkingmt
  • 浏览: 23914 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

子类到底继承了什么?(A)

 
阅读更多

Java的继承可以在结构和功能上为程序带来很好的便捷性和灵活性。但是在继承的过程中,如果不能够非常深刻的理解这其中的一些规律规则,就不能够很好的发挥继承带来的优势,甚至会造成一些错误。

 

继承和abstract

 

 

 

 

 

这三个类的代码如下:

 

import java.awt.event.*;

public abstract class grandfather implements ActionListener
{
    public abstract void m1();
}



import java.awt.event.*;

public abstract class father extends grandfather
{
    public abstract void  m2();
}



import java.awt.event.*;

public class son extends father
{
    public void m1()
    {}

    public void m2()
    {}
    
    public void actionPerformed(ActionEvent e)
    {}
}

 

 

在这个程序中,最原始的基类---grandfather,是一个抽象类,它有一个m1()的抽象方法。此外,grandfather还实现了ActionListener接口,按理说是需要重写接口中的actionPerformed()方法的,但由于grandfather本身是一个抽象类,就可以不覆盖actionPerformed()。(若将grandfather又抽象类改为普通类,编译将无法通过,编译器会提示:grandfather不是抽象的,并且未覆盖XXX中的抽象方法XXX(parameters)  )。

 

按照继承的规则,其子类---father,在继承grandfather之后,需要对m1()进行重写(overriding),但碰巧的是,father自身有一个抽象方法m2(),所以father也必须也声明为一个抽象类(否则无法通过编译),这个时候,由于father是抽象类,就可以不去覆盖其基类的抽象方法了。

 

最后一个类,father的子类---son,是一个普通的非抽象的类,这时候,由于son不抽象,就无法逃过重写的责任了,它必须将其基类father的抽象方法m2()进行重写,不仅如此,由于其基类father未重写最原始基类grandfather的抽象方法m1()和actionPerformed(),son还需要重写这两个方法。否则会编译器无法通过编译。

 

也就是说,一个抽象方法最终一定会得到重写,就算第一个子类将自身定义为抽象类,逃掉了重写的责任,以后也必然会有一个非抽象的子类来完成早该完成的重写任务。当然,如果所有类都是抽象的,抽象方法就可以一直不去重写,不过这显然是不可能,也是没有意义的。

 

在这个程序中,我认为每个类都应该定义好自己的行为,及时的重写自己该重写的方法,这样,既可以避免许多编译无法通过的麻烦,也可以提高类的内聚性,使一个类的更加凸显出自己的作用与功能(比如说grandfather实现ActionListener的接口,肯定是需要对component进行监听,那么actionPerformed()方法理应在grandf里就实现,而不该拖到son类中实现),同时还必然为子类减轻了负担。

 

更加合理的代码如下:

 

import java.awt.event.*;

public abstract class grandfather implements ActionListener
{
    public abstract void m1();
    
    public void actionPerformed(ActionEvent e)
    {}
}



import java.awt.event.*;

public abstract class father extends grandfather
{
    public abstract void  m2();
    
    public void m1(){};
    
    //public void actionPerformed(ActionEvent e)
    //{}
}



import java.awt.event.*;

public class son extends father
{
    public void m2()
    {}
    
    //public void m1()
    //{}
    
    //public void actionPerformed(ActionEvent e)
    //{}
}



 

 

此时father和son中的被注释掉的代码,视具体情况选择需不需要,father中的m1()和son中的m1(),m2(),和actionPerformed()就不仅仅为通过编译了,而是为了通过overriding与inheritance为类自身提高性能和功能,从而提高程序的效率。

分享到:
评论
2 楼 thinkingmt 2012-05-09  
引用
一个抽象方法最终一定会得到重写,就算第一个子类将自身定义为抽象类,逃掉了重写的责任,以后也必然会有一个非抽象的子类来完成早该完成的重写任务。


其实Java这样做也不难理解:作为一个抽象类,其本身是不可以被实例化的,所以就算有某些抽象方法没有实现或重写也无碍,反正在程序运行时这些方法不会被真正地调用(就算调用,也是跑到子类去调用被实现了的重写方法了。),但是我个人觉得抽象类应该是因为自身有抽象方法才把自己定义为抽象类的,而不能因为自身继承了其他类的抽象方法,为了不去重写而将自身抽象。
相反,作为非抽象类,如果类中存在有未实现的方法的话,无论是继承而来的,还是自身定义的,都是不被允许的,因为类本身是不抽象的,如果这个类被实例化后并且调用了那些没有实现的方法,效果相当于是空,因为调用的是抽象的方法,不能做任何事情,这也是为什么非抽象类必须重写基类抽象方法的原因吧!
1 楼 thinkingmt 2011-12-16  
以下段落和我的见解是一样的,分享过来:

……………………………………………………………………………………………………………

In the section on Interfaces, it was noted that a class that implements an interface must implement all of the interface's methods. It is possible, however, to define a class that does not implement all of the interface methods, provided that the class is declared to be abstract. For example,

abstract class X implements Y {
  // implements all but one method of Y
}

class XX extends X {
  // implements the remaining method in Y
}
In this case, class X must be abstract because it does not fully implement Y, but class XX does, in fact, implement Y.

……………………………………………………………………………………………………………

来自:THE JAVA TUTORIAL:Abstract Methods and Class. URL:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

相关推荐

    子类、父类查询

    有关子类和父类。A是子类,Teacher是父类。A是Teacher 的一种(子类)会继承父类李非私

    day1继承.md

    Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性...

    java三大特性之继承

    面向对象三大特征之继承 ... 如果父类装起来,子类无法直接访问,但是子类确实有继承下来, 可以通过父类提供公共方式进行访问 如果子类编写了有参构造,父类是封装状态,那么有参构造使用s

    inherit:【教程】莉沫酱教你学继承!?

    假如父类A采用了长子继承制,那么在继承中,所有资源都会被交给其最年长的子类,其他子类什么也得不到。 @长子继承制 class A: x = 100 y = 200 z = 300 在使用了长子继承制之后,我们杀掉父类,看看子类的资源有...

    java 程序设计试题及答案(8套合辑)

    A、子类能继承父类的所有方法和状态 B、子类能继承父类的非私有方法和状态 C、子类只能继承父类public方法和状态 D、子类只能继承父类的方法,而不继承状态 7.下列关于构造方法的说法正确的是( )。 A、因为...

    Python语言基础:类的继承.pptx

    在继承关系中,已有的、设计好的类称为父类、基类或超类,自定义的新类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。类继承的语法为 class 类名(被继承类类名)。 实例:使用类的继承性...

    继承中的关键字

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类最基本的功能就是维持父类的基本操作,但是子类可以对其功能的扩充。 2. ...

    Java面向对象继承.pdf

    继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也可以添加自己的属性和方法,从而实现代码的复用和扩展。继承是面向对象编程...

    举例讲解Python面向对象编程中类的继承

    就像这样就可以了,通过创建子类我们可以继承他的父类(超类)的方法。这里重新写一下cat class Cat: name = 'cat' class A(Cat): pass print A.name # cat 经典类 我们也可以这样,让A多继承。 class Cat: ...

    java课后习题 关于 编写一个类

    子类B 必须继承A 类的方法f(不允许重写),子类创建的对象不仅可以调用方法f 输出英文字母表,而 且调用子类新增的方法g 输出希腊字母表。 18..编写一个类,该类有一个方法public int f(int a,int b),该方法返回a 和...

    JAVA+OOP自测

    子类继承父类的方法访问权限保持不变 2、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的代码会不会被执行,什么时候被执行?B A. 不会执行 B. 会执行,在return前执行 C. 会执行,在return后...

    python类继承与子类实例初始化用法分析

    本文实例讲述了python类继承与子类实例初始化用法。分享给大家供大家参考。具体分析如下: [ 先贴参考书籍原文(中文英文对照)] __init__方法介绍: If a base class has an __init__() method the derived class’s...

    面向对象编程—-继承(Python版-案例详解)

    多继承:子类继承多个父类四.子类重写父类的同名属性和方法五.子类调用父类同名属性和方法六.多层继承八.super()的使用 一.继承介绍 现实中的继承 程序中的继承 在程序中,继承描述的是多个类之间的所属关系。 ...

    面试题问题合集.docx

    46、hashMap的底层、子类与基类的继承关系?hashmap的扩容机制? 48、JVM工作原理?Jvm优化? 57、SpringCloud原理?Lambda?数据库数据大小? 59、excel表头打印从a到zzz怎么做? 60、zookeper底层原理和分布式...

    关于C++中菱形继承和虚继承的问题总结

    单继承–一个子类只有一个直接父类时称这个继承关系为单继承  2. 多继承–一个子类有两个或以上直接父类时称这个继承关系为多继承 例如下面这两个例子: 例一(单继承): class A { public: int _a;

    赛杰IT -java期末测试题 笔试部分

    (4)一个子类继承父类,子类不可以继承父类中访问权限设定为 的变量和方法. A)public B) protected C)private D)未修饰 (5) 下列叙述正确的是 A) 在类中的构造方法的名字与类的名字相同, 而且不能重载 B) 在...

    Python多重继承之菱形继承的实例详解

    继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。 语法 class SubclassName(BaseClass1, ...

    php构造函数的继承方法

    第一种情况:子类没有定义构造函数时,默认继承。例子: <?php class A{ public $name; function __construct(){ echo $this->name="小强"; } } class B extends A{ } $bb = new B(); ?> 输出结果:...

    Python中多继承 & 类的搜索顺序 & 多态

    1、多继承 Python中的多继承跟java中的多继承不一样。Python中多继承可以继承多个基类。个人看法:Java多继承类似传统的繁殖模式(单个...class A: def test(self): print('-----AAAAAA') class B: def test1(self):

Global site tag (gtag.js) - Google Analytics