Java继承与组合



Java继承与组合



继承

java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承。

  • 子类继承父类的成员变量

    1. 子类能够继承父类的public和protected成员变量,不能够继承父类的private成员变量
    2. 如果在子类中出现了同名称的成员变量,则子类的成员变量会屏蔽掉父类的同名成员变量。若要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person p = new Student();
        System.out.println(p.name);
    }

}
class Person {
    public String name;
    public String sex;
    public short age;
    public Person(){
        name = "John";
        System.out.println("It is a person");
    }
}
class Student extends Person{
    public String name;
    public Student(){
        this.name = super.name;    //利用super引用父类变量
        System.out.println("It is a student");
    }
}

//输出
It is a person
It is a student
John

  • 子类继承父类的方法

    1. 能够继承父类的public和protected成员方法,不能够继承父类的private成员方法
    2. 如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用
    3. 对于父类的静态方法,可以被继承但是不能被子类中的同名方法覆盖;子类中也可以隐藏父类的成员变量,只需要声明的变量名称相同,就算变量的数据类型不同,也一样可以隐藏父类成员变量。

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person p = new Student();
        p.printName();
        p.printAge();
    }

}
class Person {
    private Pet p = new Pet();
    /*static{
        System.out.println("Person");
    }*/
    public String name;
    public String sex;
    public short age;
    public Person(String name){
        this.name = name;
    }
    public void printName(){
        System.out.println("My name is" + name);
    }
    public static void printAge(){
        System.out.println("This is used to print the people‘s age");
    }
}
class Student extends Person{
    public String name;
    public int age;
    public Student(){
        super("John");
        this.name = super.name;    //利用super引用父类变量
    }
    public static void printAge(){
        System.out.println("This is used to print the student‘s age");
    }
    public void printName(){
        System.out.println("It is used to print the student‘s name");
    }
}

//输出
It is used to print the student‘s name
This is used to print the people‘s age

  • 构造器

    1. 子类是不能够继承父类的构造器,但是,如果父类的构造器都是带有参数的,则子类的构造器中必须显示地通过super关键字调用父类的构造器并配以适当的参数列表。且必须是子类构造器的第一个语句。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

class Person {
    public String name;
    public Person(String name){
        this.name = name;
    }
    public void printName(){
        System.out.println("My name is" + name);
    }
}
class Student extends Person{
    public Student(){
        super("John");
    }
    public void printName(){
        System.out.println("It is used to print the student‘s name");
    }
}

组合

组合是指在设计类的同时,把将要组合的类的对象加入到该类中作为自己的成员变量。

class Student extends Person{
    public String name;
    public School school;        //组合
    public Student(){
        super("John");
        this.name = super.name;    //利用super引用父类变量
    }
    public void printName(){
        System.out.println("It is used to print the student‘s name");
    }
}
class Person {
    public String name;
    public Person(String name){
        this.name = name;
    }
    public void printName(){
        System.out.println("My name is" + name);
    }
}
class School {
    public String name;
    public String address;
    public void printName(){
        System.out.println("School name:" + name);
    }
    public void printAddress(){
        System.out.println("School address" + address);
    }
}

程序中选择集成或者组合的原则:

  • 如果存在一种IS-A的关系(比如Student是一个Person),并且一个类需要向另一个类暴露所有的方法接口,那么更应该用继承的机制。
  • 如果存在一种HAS-A的关系(比如Student必有一所School),那么更应该运用组合。
时间: 2024-10-03 01:11:29

Java继承与组合的相关文章

JAVA继承和组合

到底该使用组合还是继承,一个最清晰的判断办法就是问一问自己是否需要新类向基类进行向上转型.如果必须向上转型,则继承是必须要的,如果不需要,则应该好好考虑是否需要继承. 摘自 <<Java编程思想>> package com.zhyao.extend; public class Animal { private String name; public Animal(String name){ this.name = name; } public void play(Animal an

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

Java继承,多态,组合应用

继承:  面向对象的三大特征之一:    是类和类之间的一种拓展关系,是一种从一般到特殊的关系;    格式: sub   extends Super,  我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类)   泛化: 把子类中的共性抽取到父类的过程; 特化: 子类在父类的基础之上,拓展自己特有的状态和特征;    Object: 是所有类的直接父类后间接父类;      class  Student{} 等价于  class  Student extends Object{

java的继承和组合

继承和组合是java中非常常用的两种创建新类型的方法,两者都能提高代码的复用率. 继承主要是想让子类继承父类的基本特性:组合技术通常用于想在新类中使用现有类的功能,而非它的接口.两者的分别是"IS A"和"HAS A"的关系 继承: class Shape { public void draw() { System.out.println("draw a shape"); } public void erase() { System.out.pr

Java中的继承与组合

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack(). 代码如下: class Insect { private int size; private String color; public Insect

菜鸟译文(一)——Java中的继承和组合

阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和组合的概念.首先举一个继承的例子,然后展示一下如何用组合来改善继承的设计.最后概括一下如何在它们之间做出选择. 1. 继承 假设我们有一个Insect类.这个类包含两个方法:一个是move(),一个是attack(). class Insect { private int size; private

Java中的继承与组合(转载)

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack().代码如下: class Insect { private int size; private String color; public Insect(

&lt;Java中的继承和组合之间的联系和区别&gt;

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

新秀翻译(一个)——Java在继承和组合

阅读英文的程序猿的能力,这是非常重要的.过去的几年中一直在学习英语,今天心血来潮,在网上找什么鲍文简要翻译. 普通级,能力有限,看官还请大家多多指点. 译文: 本文将会举例说明Java中继承和组合的概念.首先举一个继承的样例.然后展示一下怎样用组合来改善继承的设计.最后概括一下怎样在它们之间做出选择. 1. 继承 假设我们有一个Insect类.这个类包括两个方法:一个是move().一个是attack(). class Insect { private int size; private Str