Java继承,多态,组合应用

继承:
  面向对象的三大特征之一:
  
  是类和类之间的一种拓展关系,是一种从一般到特殊的关系;
  
  格式: sub   extends Super,  我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类)
  
 泛化: 把子类中的共性抽取到父类的过程;
 特化: 子类在父类的基础之上,拓展自己特有的状态和特征;
  
  Object: 是所有类的直接父类后间接父类;
  
  
  class  Student{} 等价于  class  Student extends Object{}
  
  直接父类:  直接继承的父类,有且只有一个,也就是说Java只支持单继承;
  间接父类: 直接父类或间接的父类的父类;
  
 方法和字段:
  private 修饰的成员不能被继承;
  默认访问权限的成员能不能被继承?  要是在同一个包中就能被继承
  protected 修饰的成员,可以被继承;
  public 修饰的成员,可以被继承;
  
  构造方法能不能被继承? 不能
  
  class Person{
   
   public Person(){}
  }
  
  class Student extends Person
  {
   //public Person(){}//ERROR
  }
  
  若父类所有的构造方法是用 private 修饰,不能有子类;
  
 
 子类实例化:
  子类初始化,会先默认调用父类的一个无参的构造方法,自己再初始化;
  
  子类的构造方法里,有一个隐式的 super();
  
  若我们显示的让子类去调用父类有参数的构造方法,默认的隐式的构造方法就不会被调用了;
  
  子类对象创建之前,必须有一个父类对象;
  
  
 方法覆写:
   当父类的某一个方法不适合子类对象的时候,就应当重新修改方法体;
   
  遵循的原则:  一同 两小 一大:
  
  一同: 方法签名相同
  两小: 
   1.返回值类型可以是父类返回值类型的子类或相同;
    父类的:Object show(){
     return null;
    }
    
    子类的:  String show()
    {
     return null;
    }
   2.异常更小
  一大: 子类方法的访问权限 >= 父类方法的访问权限
    父类的: private Object show(){
     return null;
    }
    
    子类的:  String show()
    {
     return null;
    }
  
   上面这个不是覆写:因为私有成员不能被继承
  
 必杀技:  若子类方法是覆写方法的话,  那么在方法上加上 @Override  是可以编译通过的;
 
  静态方法能不能被覆写: 不能!
   
   方法的覆写:属于多态,而多态是基于对象的(父类的一个变量指向子类的一个对象);
   
   而静态方法不属于对象,属于类;
 
 super:
  用在子类.,
  super:表示父类对象
  用于调用父类的方法或字段,用法和this一模一样
  
  调用父类的构造方法:
  
  super(参数);和this(参数);
  都表示在构造方法里调用构造方法;都必须写在构造方法的第一行
  
  不同:  this(参数),调用的当前类里面的构造方法,super(参数),调用的是直接父类里构造方法
   
 多态:
 
  面向对象的三大特征之一:
  
  Person  p = new Student();
  
  p的真正类型是学生;当是我们只把他当一般人看待;
  
  编译类型: 申明变量的类型  Person ,  是我们把它当做什么
  运行类型: 创建对象的类型  Student ,  是对象真正的类型
  
  多态的产生前提:继承
  当编译类型和运行类型不一致的时候,就会产生多态;
  
  多态定义:  同一个实体有多种形态;
  
  多态的作用: 可以屏蔽不同子类对象之间的差异,从而能写出更加通用的代码,能提高效率,维护性;
  
 引用类型转换:
  
  向上转型:  小->大, 自动转换, 这里说的小和大,说的是 继承关系中的子类和父类.
    
   可以把子类对象赋给父类变量;
   Person  p = new Student();
   
   Object类是所有类的父类.那么Object类型的变量能不能接受一切值? 可以!
  
   
  向下转型: 大 -> 小
  
   父类对象强制转换成子类对象;
   
   Student  s = (Student)p;
   
   一般的,再强转之前,要先判断该对象时候属于这个类类型;
    boolean b = 对象 instanceof 类
    
    对象的类型和类必须有继承关系;
   
   先判断 p是否是学生类型: 
   
   if(p instanceof Student)
   {
    Student  s = (Student)p;
   }
   
 多态方法调用:
  
  
  1.调用的方法不是覆写方法,子类有,父类没有;
   
  2.调用的方法是覆写的方法,父类有,子类也有;
  
  class Dog
  {
   public void eat()
   {
    System.out.println("0001");
   }
  }

class Hasiqi extends Dog
  {
   public void eat()
   {
    System.out.println("0002");
   }
  }

class ZangDog extends Dog
  {
   public void eat()
   {
    System.out.println("0003");
   }
  }

class Zoo
  {
   public void feed(Dog d)
   {
    d.eat();
   }
  }

class  DogDemo
  {
   public static void main(String[] args)
   {
    Zoo zoo=new Zoo();
    Hasiqi xiaoha=new Hasiqi();
    zoo.feed(xiaoha);

ZangDog zd=new ZangDog();
    zoo.feed(zd);
   }
  }
 
 组合:
   extends  继承是一种从一般到特殊的关系,  也就是说 子类是父类的一种特殊情况;
  
   子类 is  父类的一种  is  A 关系
   
  组合,包含:  比如手机和手机卡,  手机里有手机卡 ,has  A关系
  
  class Card
  {
   private String num;//卡号

public String getNum()
   {
    return num;
   }

public void setNum(String num)
   {
    this.num=num;
   }

public Card(String num)
   {
    this.num=num;
   }
  }

//手机
  class CellPhone
  {
   private Card c;//卡是手机所包含的

public CellPhone(Card c)
   {
    this.c=c;
   }

public void connectied(String num) //联系
   {
    System.out.println(c.getNum()+"正在给"+num);
   }
  }

//人
  class Person
  {
   public void call(CellPhone c,String num)
   {
    c.connectied(num);
   }
  }

class PhoneDemo
  {
   public static void main(String[] args)
   {
    Person lucy=new Person();
    Person will=new Person();
    Card c=new Card("18720076967");

CellPhone iphone=new CellPhone(c);
    lucy.call(iphone,"10086");
   }
  }

Java继承,多态,组合应用,布布扣,bubuko.com

时间: 2024-10-27 12:32:22

Java继承,多态,组合应用的相关文章

Java继承与组合

Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类的public和protected成员变量,不能够继承父类的private成员变量 如果在子类中出现了同名称的成员变量,则子类的成员变量会屏蔽掉父类的同名成员变量.若要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用. public class Main { /** * @para

JAVA继承和组合

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

Java继承多态

一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员变量 该方法属于谁,就优先用谁成员方法重名 创建对象是谁,优先用谁的方法,没有向上找方法的覆盖重写(同,同)和重载(同,不同)@Override 注解,安全检测三. 方法覆盖重写时,注意:1.方法名,参数列表必须相同2.子类方法的返回值(String)必须[小于等于]父类方法(Object)的返回值

Java 继承、多态与类的复用

摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了它的实现机制和详细应用.此外,为了更好地理解继承和多态.我们对final关键字进行了全面的介绍. 在此基础上.我们介绍了Java中类的载入及初始化顺序.最后.我们对面向对象设计中三个十分重要的概念–重载.覆盖与隐藏进行了详细的说明. 要点: 继承 组合,继承,代理 多态 final 关键字 类载入及

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

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

JAVA基础笔记(很实用)继承-多态-抽象类-接口-异常-集合-IO-线程-Socket

第七章:Java继承 一.继承的概念 1.一个父类派生出一个子类的机制称为继承. 2.承是重用程序代码的有力手段,当多个类之间存在相同的属性和方法时,可以从这些类中抽象出父类. 3.们只需要在父类中定义这些属性和方法,而子类无须重新定义这些属性和方法,直接从父类继承即可. 4.通过继承,子类就会自动的拥有在父类中定义的属性和方法. 5.两个或多个类的成员中存在一部分相同的情况,通过继承机制,可以利用现有的类来创建新的类. 6.子类不但拥有父类的成员,还可以定义新的成员. 7.可以提高软件的可重用

java继承和多态

java方法直接调用原理推测 有错误还望指正 当直接调用某对象的某方法时  会更具该对象获取到类信息对象   在从类信息对象中找到该方法 没找到 获取父类信息对象继续查找 找到了执行  jdk距离实现是通过反射还是其它? 如果按以上原理    以下情况解释不通 创建一子类对象  赋值给一父类指针变量  通过父类指针变量掉run方法   run方法在父类或子类中为私有  这种情况调用的是父类的run方法 并非子类的run方法 反射jar包 package extend; import org.ju

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

java的继承和组合

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