Java继承与组合
Java继承与组合
继承
java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承。
- 子类继承父类的成员变量
- 子类能够继承父类的public和protected成员变量,不能够继承父类的private成员变量
- 如果在子类中出现了同名称的成员变量,则子类的成员变量会屏蔽掉父类的同名成员变量。若要在子类中访问父类中同名成员变量,需要使用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
- 子类继承父类的方法
- 能够继承父类的public和protected成员方法,不能够继承父类的private成员方法
- 如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用
- 对于父类的静态方法,可以被继承但是不能被子类中的同名方法覆盖;子类中也可以隐藏父类的成员变量,只需要声明的变量名称相同,就算变量的数据类型不同,也一样可以隐藏父类成员变量。
- 构造方法是在新建对象的时候才会执行,静态语句块和静态方法在类加载到内存的时候就已经执行了,当新建一个A类对象时,先调用A的父类的静态方法,再调用A类的静态方法,最后才是A的父类的构造函数、A类的构造函数。
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
- 构造器
- 子类是不能够继承父类的构造器,但是,如果父类的构造器都是带有参数的,则子类的构造器中必须显示地通过“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),那么更应该运用组合。
Java继承与组合的更多相关文章
- Java继承和组合
为了保证父类有良好的封装性,不会被子类随意修改,设计父类通常应该遵循以下规则: 1.尽量隐藏父类的内部数据,尽量把父类的所有成员变量设置为 private 访问类型,不要让子类直接访问父类的成员变量: ...
- java 继承还是组合
1.我真的需要上溯转型(upcasting)吗? 如果是,才会用到继承. 2.
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类
目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...
- java 中继承,组合,重载,重写的实现原理 (转)
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- Java中的继承与组合(转载)
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- Java中的继承与组合
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- [译]Java中的继承 VS 组合
(文章翻译自Inheritance vs. Composition in Java) 这篇文章阐述了Java中继承和组合的概念.它首先给出了一个继承的例子然后指出怎么通过组合来提高继承的设计.最后总结 ...
随机推荐
- 50个jQuery插件可将你的网站带到另一个高度
Web领域一直在发生变化并且其边界在过去的每一天都在发生变化(甚至不能以小时为计),随着其边界的扩展取得了许多新发展.在这些进步之中,开发者的不断工作创造了更大和更好的脚本,这些脚本以插件方式带来更好 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- Django 搭建简易博客
新增一个 APP 博客算是一个功能集,因此我们应将其体现为一个模块.这表现在 Django 应用里则是为其创建一个 APP Package.现在让 manage.py 中的 startapp 闪亮登场 ...
- POJ1026 Cipher(置换的幂运算)
链接:http://poj.org/problem?id=1026 Cipher Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- TestNG Assert 详解
org.testng.Assert 用来校验接口测试的结果,那么它提供哪些方法呢? 中心为Assert测试类,一级节点为方法例如assertEquals,二级结点为参数类型及参数个数,double 3 ...
- NLP常用工具
1.统计类工具:可参见[统计学习常用Python扩展包] 2.linux自带工具:可参见[[整理]Linux常用文本处理命令] 3.简繁转换工具:opencc Open Chinese Convert ...
- Unity学习疑问记录之向量基础
这里写得非常好了: http://blog.gamerisker.com/archives/347.html
- 多文档上传(upload multiple documents)功能不能使用怎么办?
问题描述: 在SharePoint 2010的文档库里选择documents标签,然后选择upload document下拉菜单,你会发现upload multiple documents那个按钮是灰 ...
- for 循环中 continue
- 安装SQL Server2016正式版
安装SQL Server2016正式版 今天终于有时间安装SQL Server2016正式版,下载那个安装包都用了一个星期 安装包可以从这里下载: http://www.itellyou.cn/ ht ...