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继承,多态,组合应用的更多相关文章
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- java继承多态和抽象类接口
一.继承 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类).(1)继承的优点: ①代码的可重用性: ②父类的属性 ...
- 学习博客之Java继承多态接口
这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...
- java 继承多态的一些理解不和不理解
1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...
- Java继承和组合
为了保证父类有良好的封装性,不会被子类随意修改,设计父类通常应该遵循以下规则: 1.尽量隐藏父类的内部数据,尽量把父类的所有成员变量设置为 private 访问类型,不要让子类直接访问父类的成员变量: ...
- java 继承多态的一些理解和不理解
1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...
- java继承,多态
子类继承父类,用父类去接收子类,其实我觉得用父类,子类来形容继承关系是不恰当的,比如再发生多态的时候,Car c = new W();w是大众,你能说Car 和W是父子关系吗,我觉得用所属关系类描述可 ...
- java 继承还是组合
1.我真的需要上溯转型(upcasting)吗? 如果是,才会用到继承. 2.
- Java继承多态
一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员 ...
随机推荐
- Format specifies type 'int' but the argument has type 'struct node *'
/Users/Rubert/IOS/iworkspace/LineList/LineList/main.c::: Format specifies type 'int' but the argumen ...
- 【转】基于第一个PhoneGap(cordova)的应用详解
PhoneGap是一套能让你使用HTML5轻松调用本地API接口和发布应用到商店的应用开发平台.官方说有低成本,低开发周期,轻量化等优点,这些咱暂时也没法证明,略过不表.但是有一条跨平台,却是很明显的 ...
- aar引用 no executable code found问题
主工程中 repositories { flatDir { dirs project(':trade_module').file('libs') }} dependencies { compile f ...
- Nexus3.0.0+Maven的使用(二)
因为Nexus3.0.0与Nexus2.X系列的差别很大,所以本章节我大概讲解下Nexus3.0.0的功能使用. 1.功能介绍 1.1 Browse Server Content 1.1.1 Se ...
- C++中三种new的用法
转载自:http://news.ccidnet.com/art/32855/20100713/2114025_1.html 作者: mt 1 new operator,也叫new表达式:new表达式比 ...
- 第一次用阿里云ecs配置pptp vpn遇到的问题。
在国外没办法使用一些国内一些涉及版权的网站,各种音乐和视频都没法看很不爽.自己租了个ecs.vps上安装vpn网上很多教程,但是有些地方只是copy上去还是不行的,得根据vps的具体情况改动一下才可以 ...
- sencha touch+phonegap+node.js打包
这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境下,最后 ...
- 不安装Oracle客户端情况下使用PL/SQL 远程连接数据库
附送PL/SQL Developer11中文版下载地址 1.先到Oracle网站下载Instant Client : http://www.oracle.com/technetwork/databas ...
- hive删除数据
按分区删除: ALTER TABLE test1 DROP PARTITION (dt='2016-04-29'); 删除符合条件的数据: insert overwrite table t_tabl ...
- MVC中的Html.Partial和Html.RenderPartial
Partial辅助方法用于将部分视图渲染成字符串.注意没必要为视图指定路径和文件扩展名,因为运行时定位部分视图与定位正常视图使用的逻辑相同.例如,下面代码就渲染一个名为AlbumDisplay的部分视 ...