`

JAVA基类和派生类

    博客分类:
  • J2EE
阅读更多
JAVA基类和派生类


  从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。
      在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用。
   
Java代码  收藏代码
public class Humans {    
    Humans(){ 
        System.out.println("我是人!"); 
    } 
     

  
Java代码  收藏代码
public class Student extends Humans{ 
 
    Student(){ 
        System.out.println("我是学生!"); 
    } 
 


Java代码  收藏代码
public class test { 
    public static void main(String args[]){ 
          new Student(); 
    } 

输出结果为:
      我是人!
     我是学生!
可以发现,总是基类的构造器先被初始化。
但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。
Java代码  收藏代码
public class Humans { 
     
    private String name; 
 
    Humans(String name){ 
        System.out.println("我是叫"+name+"的人"); 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 


Java代码  收藏代码
public class Student extends Humans{ 
     
    private String name; 
 
    Student(String name){ 
        super(name); 
        System.out.println("我是学生!"); 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 


Java代码  收藏代码
public class test { 
    public static void main(String args[]){ 
        new Student("zhangsan"); 
    } 

输出结果:
我是叫zhangsan的人
我是学生!
如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。

但是如果Humans的代码变成这样就不会错。如下代码:
Java代码  收藏代码
public class Humans { 
     
    private String name; 
 
    Humans(){ 
        System.out.println("我是人!"); 
    } 
    Humans(String name){ 
        System.out.println("我是叫"+name+"的人"); 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 


Java代码  收藏代码
public class Student extends Humans{ 
     
    private String name; 
     
    Student(String name){ 
        //super(name); 
        System.out.println("我是学生!"); 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 


Java代码  收藏代码
public class test { 
    public static void main(String args[]){ 
        new Student("zhangsan"); 
    } 

输出结果为:
        我是人!
        我是学生!
原因是,如果基类有一个无参的构造器,就算派生类不用super显示调用基类的构造函数,编译器也会自动
去调用基类的无参构造函数。
所以上面的代码不会报错,输出结果也不是
        我是叫zhangsan的人
        我是学生!
而是
        我是人!
        我是学生!
派生类继承了基类的所有public和protected属性和方法,代码如下:
Java代码  收藏代码
public class Humans { 
     
    public String sex; 
     
    protected int age ; 
     
    private String name; 
 
 
    Humans(String sex,String name,int age){ 
        this.sex = sex; 
        this.name = name; 
        this.age = age; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 


Java代码  收藏代码
public class Student extends Humans{ 
     
    Student(String sex ,String name,int age){ 
        super(sex,name,age); 
    } 


Java代码  收藏代码
public class test { 
    public static void main(String args[]){ 
        Student s = new Student("男","zhangsan",10); 
        System.out.println(s.sex); 
        System.out.println(s.name); 
        System.out.println(s.age); 
    } 

上面的System.out.println(s.name);会报错,因为name是private属性,如需访问,采用get方法:

Java代码  收藏代码
System.out.println(s.getName()); 
输出结果为:

zhangsan
10

如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。如将student改为如下代码:
Java代码  收藏代码
public class Student extends Humans{ 
     
    public String sex; 
     
    protected int age ; 
     
    private String name; 
     
    Student(String sex ,String name,int age){ 
        super(sex,name,age); 
    } 
     
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 

输出结果为:
null
null
0
因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。
只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:
Java代码  收藏代码
public class Student extends Humans{ 
     
    public String sex; 
     
    protected int age ; 
     
    private String name; 
     
    Student(String sex ,String name,int age){ 
        super(sex,name,age); 
        this.sex = sex; 
        this.name = name; 
        this.age = age; 
    } 
     
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 


输出结果为:

zhangsan
10

要注意的是,super必须在构造器的最前面,不然会报错。
分享到:
评论

相关推荐

    Java语言程序设计(郑莉)第七章课后习题答案

    Java语言程序设计,第七章答案,郑莉,清华大学出版

    定义三个类Point,Circle和Cylinder,Point类为基类,为上述3个类添加计算面积的成员函数Area(),要求函数Area()采用虚函数的形式,并通过基类指针调用虚函数Area()。

    题目:定义三个类Point,Circle和Cylinder,Point类为基类,为上述3个类添加计算面积的成员函数Area(),要求函数Area()采用虚函数的形式,并通过基类指针调用虚函数Area()。 编程环境:vs2010 属性:控制台应用程序...

    java 编程基础题

    写出一个类People,并由该类做基类派生出子类Employee和Teacher。其中People类具有name、age两个保护成员变量,分别为String类型和整型,且具有共有的getAge()成员方法,用于返回age变量的值,并编写一个两个参数的...

    多态思维导图.xmind

    多态思维导图.xmind

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也...

    设计一个Person类,有Person类派生一个Student类和一个Teacher类

    设计一个Person类,有Person类派生一个Student类和一个Teacher类,Student类包括姓名,编号,和成绩。Teacher类包括姓名,编号,职务和部门。又要用的来下载啊,希望对你有所帮助。

    2016 Java 基础 面试题

    这是我最近的面试题目,都是java基础的面试题,面试java初级的一些没有涉及到框架的Java基础,前面几个题目我贴了网址,后面的问题或者方向的答案自己百度,祝早日找到好工作,

    面向对象程序设计:JavaSE-任务81

    面向对象程序设计:JavaSE-任务81

    面向对象程序设计:JavaSE-任务41

    (2)设计实现画板类,在画板类的main方法中①画一个圆形(即创建一个圆形对象,并给其成员属性赋值),然后调用方法获取它的面积和周长并打印 (1)定义时间类(类

    Java程序员面试宝典

    Java程序员面试--葵花宝典 1、面向对象的特征有哪些方面 1.继承:继承是一种联结类的层次模型,并且允许和鼓励类...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    史上最全Java面试题目大集合

    派生类可以从它的基类那里继承方法和实例变量,17. 并且类可以修改或增加新的方法使之更适合特殊的需要。 18. 封装:封装是把过程和数据包围起来,19. 对数据的访问只能通过已定义的界面。面向对象计算始于这个基本...

    java面试题及答案(基础题122道,代码题19道).doc

    1、面向对象的特征有哪些方面  1.抽象:  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    Java笔试题目汇总

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 (3)封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

    2011最新最全的JAVA面试题总结.txt

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

    JAVA面试题(很全面)

    1.抽象:  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前 目标有关的方面。...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加 新的方法使之更适合特殊的需要。

    JAVA面试题目总

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    java面试笔试题集合

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    Java面试笔试题大汇总

    java面试笔试题大汇总 JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前...派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

    Python基类函数的重载与调用实例分析

    因为之前接触过Java和C++,所有对于面向对象的思想也早已经很熟析的了。这里也不再对面向对象是什么进行赘述了。我们直接上代码吧!看看对于继承和基类函数的调用在Python中是如何调用的~ 首先,是基类文件base.py ...

    Java面试题大全(doc)

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

Global site tag (gtag.js) - Google Analytics