Java,extends,继承

1. 继承的概念:

  继承在本职上是特殊——一般的关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。

2. 继承中的初始化顺序:

  从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属性和实例属性)、方法(包括类方法和实例方法)、构造器和初始化块(包括类的初始化块和实例的初始化块)。对于继承中的初始化顺序,又具体分为类的初始化和对象的初始化。

  类初始化:

  在jvm装载类的准备阶段,首先为类的所有类属性和类初始化块分配内存空间。并在类首次初始化阶段中为其进行初始化,类属性和类初始化块之间的定义时的顺序决定了其初始化的顺序。若类存在父类,则首先初始化父类的类属性和类初始化块,一直上溯到Object类最先执行。

  对象初始化:

  在new创建对象时,首先对对象属性和初始化块分配内存,并执行默认初始化。如果存在父类,则先为父类对象属和初始化块先分配内存并执行初始化。然后执行父类构造器中的初始化程序,接着才开始对子类的对象属性和初始化块执行初始化。

注意:

  1. 在对象初始化阶段,属性和方法均针对子类可以从父类继承过来的属性和方法而言,一般而言,都是针对父类中非private而言的。

因为private修饰的为父类所特有的,子类没有继承过来,当new子类时,无须为其分配空间并执行初始化。当然了,父类的构造器子类也是不继承过来的,

但构造器另当别论。

  2. 类的初始化只执行一次,当对同一个类new多个对象时,类属性和类初始化块只初始化一次。

3.继承中的修饰符以及属性隐藏

  Java类具有三种访问控制符:private、protected和public,同时当不写这三个访问控制符时,表现为一种默认的访问控制状态。因此,一共具有四种访问控制级别。

具体访问控制表现如下:

  private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;

  默认不写,这类修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;

  protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;

  public修饰的属性或方法外部类中都可以直接访问。

  当子类继承父类,子类可以继承父类中具有访问控制权限的属性和方法(一般来说是非private修饰的),对于private修饰的父类所特有的属性和方法,子类是不继承过来的。

  当子类需要改变继承过来的方法时,也就是常说的重写父类的方法。一旦重写后,父类的此方法对子类来说表现为隐藏。以后子类的对象调用此方法时,都是调用子类重写后

的方法,但子类对象中想调用父类原来的此方法时,可以通过如下两种方式:

  1.将子类对象类型强制转化为父类类型,进行调用;

  2.通过super调用。

  同样的,如果在子类中定义父类中相同名称的属性时,父类属性在子类中表现为隐藏。

4.继承中的this和super:

  构造器中的this表示当前正在初始化的对象引用,方法中的this表示当前正在调用此方法的对象引用。this具体用法表现在一下几个方面:

  1.当具多个重载的构造器时,且一个构造器需要调用另外一个构造其,在其第一行使用this(param)形式调用,且只能在第一行;

  2.当对象中一个方法需要调用本对象中其他方法时,使用this作为主调,也可以不写,实际上默认就是this作为主调;

  3.当对象属性和方法中的局部变量名称相同时,在该方法中需要显式的使用this作为主调,以表示对象的属性,若不存在此问题,可以不显式的写this。

  其实,其牵涉到的一个问题就是变量的查找规则:先局部变量 => 当前类中定义的变量 => 其父类中定义的可以被子类继承的变量 => 父类...

  super表示调用父类中相应的属性和方法。在方法中,若需要调用父类的方法时,也一定要写在第一行

总例:

package com.wen1227;

public class Niao {
    private String name;
    private int age;

    public Niao(String name){
        this.name=name;
    }
    public Niao(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName(){
        return name;
    }
    public void  setName(String name){
         this.name=name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age=age;
    }

    public void Zou(){
        System.out.println(name+"正在走路");
    }
}

  创建一个Niao的类给他定义一个name和age的属性写为private私有的。

  然后这里定义了两个构造函数进行重载,一个有一个参数,一个有两个参数。

  因为上面定义的属性name和age都是私有的(private),所以后面子类继承的时候无法继承到这些属性,那么就需要在父类中定义一个方法来获取name和age再定义一个方法来改变name和age的内容。

  最后再定义一个Zou的方法让他输出一个内容。

package com.wen1227;

public class XiQue extends Niao {
    public XiQue(String name){
        super(name);
    }
    public XiQue(String name,int age){
        super(name,age);
    }

    public void Zou(){
        super.Zou();
        System.out.println(this.getName()+"feifeifeifeifei"+this.getAge());
    }
}

  这里定义了一个XiQue作为子类继承了父类Niao的属性, 这里同样也写了两个构造函数来进行重载,但是子类XiQie里面没有name和age的内容,只能调用父类的,所以这里定义的构造函数例就用到了super属性。

  同样在子类XiQue里面有一个方法Zou,然后写一个super调用父类的Zou属性(从结果上你就会一目了然),只是对Zou的属性进行了修改,这叫重写。

package com.wen1227;

public class Test {

    public static void main(String[] args) {
        XiQue x =new XiQue("张三",3);
        x.Zou();
        Niao n =new Niao("lisi");
        n.Zou();
    }

}

  最后采用一个main函数调用,先new一个XiQue,让其进行XiQue的Zou,然后new一个Niao,让其进行Niao的Zou,最后输出的结果为

张三正在走路
张三feifeifeifeifei3
lisi正在走路

  因为先调用了XiQue的,他里面先调用了super.Zou();所以先输出父类的,然后再执行XiQue的System.out.println(this.getName()+"feifeifeifeifei"+this.getAge());最后再执行父类的Zou。 所以是三行,一目了然。

5. 继承与组合:

  从单纯的实现效果上看,继承和组合都能达到同样的目的。并且都是实现代码复用的有效方式。

  但在一般性的概念层次中,两者具有较为明显的差别。

  继承表现为一般——特殊的关系,子类是一个特殊的父类,是is-a的关系。父类具有所有子类的一般特性。

  组合表现为整体——部分关系。在组合中,通过将“部分”单独抽取出来,形成自己的类定义,并且在“整体”

  这个类定义中,将部分定义为其中的一个属性,并通过get和set方法,以此可以调用“部分”类中的属性和方法。

时间: 2024-09-30 19:01:11

Java,extends,继承的相关文章

【java的继承extends】

java中 "继承"是面向对象软 件技术当中的一个概念.如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类".继承可以使得子类具有父类的各种属性和方 法,而不需要再次编写相同的代码.在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能. 继承的基本概念 1.继承是面向对象的三大特性之一.(封装,继承,多态) 2.被继承的类是父类,继承父类的类是子类 3.继承

Java的继承与多态

Java的继承与多态对于提高开发效率,减少开发量,是非常有帮助的,也便于代码维护.下面是根据书上讲的,我又做了改进的例子. 假设需求: 公司需要对所有人员进行管理,所有人员分为普通员工和经理人,他们的头衔.工资.生日等信息都是不一样的,但是不能开发两套系统分别进行管理,而是要一套系统完成对所有人的管理. 设计一个员工类,这是父类,定义如下: package com.myHelloWorld; import java.text.ParseException; import java.text.Si

java基础-继承

一个由其他类继承的类叫子类(也叫继承类,扩展类等),该类继承的类叫父类或超类.除了Object类意外,所有的类都有切仅有一个父类,如果一个类没有用extends关键词声明父类,则该类隐含继承Object类,因此如果一个类继承另外一个父类,而该父类可能又是继承的另外一个类,最终的起点在Object类. java中继承的概念简单而强大,当你需要定义的一个类中的许多代码已经在另外一个类中存在时,我们就可以选择定义时继承该类,这样免去许多书写和调试的麻烦,子类能够继承父类的字段,方法和嵌套类,即类成员,

java类继承总结一 父类类型与子类类型之间的转化问题(转)

java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂的java.lang.ArrayStoreException异常. 1. 子类数组的引用可以装换为超类数组的引用 2. 子类的引用child可以转换为父类的引用parent(这里假设parent是父类对象,child是子类对象),但却不可以通过 parent调用child的特有方法 class Em

Java面向对象㈡ -- 继承与多态

Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆盖的概念.覆盖被用来支持多态.实际开发中Java通常继承于抽象类,实现于接口.如果不希望一个类被继承,或者一个方法被覆盖,或者一个成员变量被改变,就可以用final修饰.这里只说明两个问题:1,重载和覆盖的区别重载和覆盖的区别:重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类

Java多态-继承与清理

通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常会留给垃圾回收器进行处理.如果确是遇到清理问题,那必须用心为新的类创建dispose()方法(在这里我们选用此名).并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖被继承的dispose()方法.当覆盖被继承的diopose()方法时,务必记住调用基类版本dispose()方法:否则,基类的清理动作就不会发生.下例便是一个证明: package polymorphism; class C

Java之继承和权限控制(三)

关键字:extends; 继承后,子类拥有了父类所有的成员(成员变量和方法): java只支持单继承,不允许多继承,即一个类只能有一个父类,但是一个类可以有多个子类. 权限修饰符: 成员变量的修饰符包括public.private.default.protected. class的修饰符包括:public.default public:可以在任何地方被访问: default:只可以被同一个包内部的类访问. 方法重写: 在子类中可以根据需要重写从父类中继承来的方法: 重写方法和被重写方法必须具有相

Java方法继承、方法重载、方法覆盖小总结

转自:http://blog.csdn.net/cdsnmdl/article/details/3968688 ———————————————————————————————————— 1.方法继承:利用extends关键字一个方法继承另一个方法,而且只能直接继承一个类. 当Sub类和Base类在同一个包时Sub类继承Base类中的public/protected/默认级别的变量个方法 在不同包时继承public/protected级别的变量和方法. 2.方法重载:如果有两个方法的方法名相同,但

古典音乐 (java基础 继承)

摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 一.前言 小朽不才,最近爱上了听古典音乐收录了,mozart ,贝多芬-等好听的歌很是喜欢.戴上耳机,打开电台,整理下java继承. 总结如下: 继承(extends) 方法覆盖(Mehtod Overriding) protected 向上转型 二. 继承(extends) 从编码中,咱们总是在不知不觉的用继承,明确的调用,或是隐式的调用了java根类Object.什