java is a_java中的继承(is a )和组合(has a)
我们知道java语言有三大特性:封装,继承,多态
但是继承和封装却是一对有点矛盾的两个方面,怎么理解??
我们想想:封装的目的是想让隐藏类中的属性和方法。但是在继承过程中,我们的子类肯定会继承父类的方法和字段,而且我们还可以覆盖父类的方法
着就有一点破坏封装 要隐藏类属性的目的了!虽然我们可以同过声明变量和方法是private来避免类的属性和方法被继承,
但是如果属性和方法都使用private不让子类继承,那么三大特性之一继承不就是没有意义了吗???
我们还是看看继承在java中时怎么实现的
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Bird bird=new Bird();
bird.beat();
bird.breath();
bird.fly();
Wolf wolf=new Wolf();
wolf.beat();
wolf.breath();
wolf.run();
}
}
//Bird和Wolf类的父类
class Animal
{
public void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
System.out.println("努力呼吸");
}
}
//继承自Animal类
class Bird extends Animal
{
public void fly()
{
System.out.println("鸟儿飞啊飞");
}
public void beat()
{
System.out.println("bird is beating");
}
}
//继承自Animal类
class Wolf extends Animal
{
public void run()
{
System.out.println("跑啊跑");
}
//子类覆盖了父类的方法
public void breath()
{
System.out.println("wolf is breathing");
}
}
在上面的继承例子中,我们看到了父类的方法被子类覆盖,这种继承对类的封装是不利的!
为了提高类的封装,我们提出组合,组合是通过将原先的父类的方法和属性跟子类重新组合成一个新的类型!
class Animal
{
public void beat()
{
System.out.println("心脏跳动");
}
public void breath()
{
System.out.println("努力呼吸");
}
}
class Bird
{
private Animal animal;
public Bird(Animal animal)
{
this.animal=animal;
}
private void fly()
{
System.out.println("鸟儿飞啊飞");
}
public void beat()
{
//将“父类”的方法直接组合进来
animal.beat();
}
}
class Wolf
{
private Animal animal;
public Wolf(Animal animal)
{
this.animal=animal;
}
public void run()
{
System.out.println("跑啊跑");
}
//将“父类”的方法直接组合进来
public void breath()
{
animal.breath();
}
}
复用其实就是在新的类型中声明要复用的类的对象,并将要复用类方法的嵌入到新类相同的方法中
我们可以看出:在java我们为了复用某个类中的成员,我们可以用继承的方法,但是为了不破坏类封装的特性,我们还可以用组合的方法,来实现复用!
我们可以想想复用和继承的优缺点:
1.复用让类更封装,但是真大了编程量,因为每个父类的方法都得手动嵌入如:beath()
2.复用和封装消耗的内存空间差不多,他们都得为方法好字段分配存储位置!
java is a_java中的继承(is a )和组合(has a)相关推荐
- Java 列举数组中任意元素和为定值的组合
import java.util.Arrays;/*** 列举数组中任意元素和为定值的组合*/ public class SolveProb {// Arrays.sort(arr);static i ...
- java中静态方法可以被继承_关于java:静态方法中的继承
为什么下面的代码会打印"MAIN"? public class Main { public static void method() { System.out.println(&q ...
- java is a_java中 is - a和 has - a的区别
Java中is-a和has-a的区别 1."is-a"是继承的关系,比如人是动物,人和动物是继承的关系; 2."has-a"是聚合的关系,比如人有眼睛,人和眼睛 ...
- .NEt中的继承、聚合和组合
转载: 类间 关系 在类图中,除了需要描述单独的类的名称.属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义.在UML类图中,关系用 ...
- Java数据结构一 —— Java Collections API中的表
1.Collection接口 位于java.util包中,以下是重要的部分. 1 public interface Collection<AnyType> extends Iterable ...
- java 的继承_关于java中的继承
我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...
- 详细分析如何在java代码中使用继承和组合
文章目录 继承与组合 何时在Java中使用继承 何时在Java中使用组合 继承与组成:两个例子 用Java继承重写方法 Java不具有多重继承 使用super访问父类方法 构造函数与继承一起使用 类型 ...
- java的继承_java中的继承(一)
在java中,所有的类都有一个默认的父类Object,即使我们没有显式的去继承这个类.在Object类中定义了一些方法,其中有几个方法是我们必须掌握的,比如equals方法,hashCode方法,wa ...
- java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
java中抽象类继承抽象类 示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不 ...
最新文章
- java mysql 变量_MySQL基础_变量
- html自动移动滚动条,css隐藏移动端滚动条并平滑滚动
- UA MATH565C 随机微分方程V Stationary Measure
- 装机之windows10和ubuntu双系统
- 江西省一级计算机考试试题,2江西省计算机一级考试试题
- python length从哪个包引入_python collections包
- hdu 1054 Strategic Game
- 如何用iMazing导出苹果手机短信(彩信)
- xBIM 基础07 创建WebBIM文件
- 系统目录WINDOWS下主要文件夹简介
- 关于西门子plc的CPU
- 【老生谈算法】matlab特定人语音识别算法——语音识别算法
- 分类问题-决策树模型
- 威尔特拉斯定理_什么是数学 (R·柯朗 H·罗宾 著)
- 回顾丨2021年声纹识别研究与应用学术研讨会
- 如何通过PTTools显示正在种子的PT网站
- 浅谈springboot
- 恩兔NS-1刷ARMBIAN教程
- linux下制作pe启动盘工具,自己动手定制winpe dos工具箱迷你linux u盘启动盘
- 30 个Python代码实现的常用功能(附案例源码)
热门文章
- 113资讯网:最近在玩一个4414站长论坛,可以发帖赚钱的站长论坛!
- (二)Hello world JasperReport
- 【项目】员工管理系统
- 在Word 中用C#查找Wingdings符号
- VMware ESXi安装window10方法
- Oracle小型机死机,十三起惨痛宕机案例
- oracle故障分析报告,Oracle 数据库异常宕机错误分析:ORA-01092
- 利用两台虚拟机搭建Nginx高可用集群、宕机测试、宕机恢复
- FreeType像素格式:FT_PIXEL_MODE_GRAY
- codeblocks全屏模式怎么退出_极速PDF安卓版如何翻页、阅读模式修改等操作详解...