这几天正在看HeadFirst的时候,突然认为面向对象的几个特点,有点理解模糊不清。所以在这再次回想一下,加深印象。

上篇博客(http://blog.csdn.net/u010539352/article/details/39500455)中已经解说了3个面向对象的特点,以下解说剩下的。

多态:假设一个人想养一个宠物。想养狗就养一条狗,想养一仅仅猫就养一仅仅猫,该怎么实现?那就用到了多态。能够随机切换。不修改“人”这个类中的代码。具有动态和灵活性。以下举例:

class Animal {
private String name;
Animal(String name) {this.name = name;} public void enjoy(){
System.out.println("叫声......");
}
} class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() {
System.out.println("猫叫声......");
}
} class Dog extends Animal {
private String furColor;
Dog(String n,String c) {super(n); furColor = c;} public void enjoy() {
System.out.println("狗叫声......");
}
} class Lady {
private String name;
private Animal pet; //定义了一仅仅父类宠物,这样能够是狗宠物,也能够是猫宠物,具有动态性,最灵活
Lady(String name,Animal pet) {
this.name = name; this.pet = pet;
}
public void myPetEnjoy(){pet.enjoy();}
} public class Test {
public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
l1.myPetEnjoy(); //多态,实际New出来的对象的方法。所以是猫的enjoy()方法
l2.myPetEnjoy(); //狗的enjoy()方法
}
}

显示结果:

解释:执行期间New出来那个对象。我们就调用谁的方法。执行期间我们New出来的是狗和猫的enjoy方法。所以调用的是猫和狗的enjoy方法。具有动态性。所以执行出来就是女孩养的猫高兴了,所以猫的enjoy方法就执行了,结果:猫叫声…..
女孩养的狗高兴了,所以猫的enjoy方法就执行了,结果:狗叫声…..如今假设再加一个鸟。不用改变原来的代码。直接加入一个类就能够,可扩展性。

总结例如以下:当使用多态方式调用方法时,首先检查父类中是否有该方法,假设没有则编译错误,假设有再去调用子类的该同名的方法。所以多态必须具备3个条件:要有继承,要有重写,父类引用指向子类对象。

从多态样例能够看出。父类的enjoy方法没有必要实现,由于子类必需要进行重写。父类写了还有点多余,所以就用到了抽象。

抽象:用abstractkeyword修饰。以下举例:

abstract class Animal {                //抽象类
private String name;
Animal(String name) {this.name = name;} public abstract void enjoy(); //抽象方法,仅仅有定义没有实现。
} class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {super(n); eyesColor = c;} public void enjoy() {
System.out.println("猫叫声......");
}
} class Dog extends Animal {
private String furColor;
Dog(String n,String c) {super(n); furColor = c;} public void enjoy() {
System.out.println("狗叫声......");
}
} class Lady {
private String name;
private Animal pet;
Lady(String name,Animal pet) {
this.name = name; this.pet = pet;
}
public void myPetEnjoy(){pet.enjoy();}
} public class Test {
public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}

解释:能够看出来带有abstractkeyword的类被定义为了抽象类。方法被定义为了抽象方法。仅仅有定义没有实现。在子类中实现。

所以。抽象类必须被继承。抽象方法必须被重写。

上面讲了继承,重写。抽象,多态。用这几个的结合体能够实现非常完美的编程,可是美中不足的是Java里不能实现多继承,这里我们就用到了接口。

接口:是一种特殊的抽象类。仅仅包括常量和方法的定义。没有变量和方法的实现。

。几个不相关的类能够实现同一个接口。一个类能够实现多个接口。相当于多继承。

举例:

interface Animal {            //接口类
public void call();
} interface Animal1 { //接口类
public void run();
} class Dog implements Animal { //狗类实现接口
private String name;
Dog(String name)
{this.name = name;} public void call() { //实现了接口方法
System.out.println("狗叫声......");
} public String getName() {
return name;
} public void run() { //实现了接口方法
System.out.println("狗跑......");
}
} class Cat implements Animal { //猫类实现接口
private String name;
Cat(String name) {this.name = name;} public void call() { //实现了接口方法
System.out.println("猫叫声......");
} public String getName() {
return name;
} public void run() { //实现了接口方法
System.out.println("猫跑......");
}
} public class Interface {
public static void main(String args[]){
Cat c = new Cat("cat");
Dog d = new Dog("dog");
c.call();
c.run();
d.call();
d.run();
}
}

显示结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDUzOTM1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

解释:在接口类中没有写方法的实现。可是普通类必须对接口全部的方法进行重写。

总结:重写必需要有继承。

多态必需要有继承和重写。

抽象必需要有继承和重写。

用抽象来实现多态。

接口必需要有实现。

这样总结一遍,思路一下子清晰多了。

多多总结没有坏处。

java-面向对象(二)的更多相关文章

  1. Java面向对象(二)

    面向对象(Object Oriented) Java支持面向对象三大特性:封装.继承.多态.(抽象)1.封装(Encapsulation)封装:隐藏对象内部的复杂性,只对外公开简单的接口.便于外界调用 ...

  2. Java面向对象(二) 接口、多态和泛型

    一.接口 二.多态 多态是同一个行为具有多个不同表现形式或形态的能力. 2.1 类型转换 转换方式 隐式 向上转型 对于基本数据类型,存储容量低的可自动向存储容量高的类型转换 对于引用变量,子类可被转 ...

  3. 深入java面向对象二:final关键字

    文章内容源于对<疯狂java讲义>及<疯狂Java:突破程序员基本功的16课>学习和总结. 一. final成员变量 final 修饰变量时,表示该变量一旦获取了值就不可以改变 ...

  4. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  5. 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》

    20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...

  6. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  7. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  8. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  9. Java程序设计 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏 ...

  10. 20145113 实验二 Java面向对象程序设计

    20145113 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 1.初 ...

随机推荐

  1. POJ - 3257 Cow Roller Coaster (背包)

    题目大意:要用N种材料建一条长为L的路,如今给出每种材料的长度w.起始地点x.发费c和耐久度f 问:在预算为B的情况下,建好这条路的最大耐久度是多少 解题思路:背包问题 dp[i][j]表示起始地点为 ...

  2. php5.5安装笔记

    这次没想到本来很简单的php编译,没想到遇到那么多问题.再此记录一下. 1.php5.5编译安装主要有一个难点,就是GD库的问题,因为php5.5的GD库必须是2.1以上的版本哦 原来都是用的gd2. ...

  3. 使用神经网络-垃圾邮件检测-LSTM或者CNN(一维卷积)效果都不错【代码有问题,pass】

    from sklearn.feature_extraction.text import CountVectorizer import os from sklearn.naive_bayes impor ...

  4. 循环引用的weak和assgin

    __weak 当对象销毁后weakSelf指向的地址为nil __unsafe_unretained 挡圈对象销毁后,weakSelf执行的地址为不变,而地址对应对象已经销毁,再次访问该对象就崩溃,相 ...

  5. HD-ACM算法专攻系列(16)——考试排名

    问题描述: 源码: 主要要注意输出格式. #include"iostream" #include"iomanip" #include"algorith ...

  6. SQL Server数据库性能优化

      开篇:    最近遇到了很多性能问题,一直没来的及总结,今天正好周末抽时间总结下: 对于稍微大点的公司或者说用户多一些的公司,说白了就是数据量较大的公司,在查询数据时往往会遇到很多瓶颈.这时就需要 ...

  7. Ubuntu包管理工具整理

    概述 常用的包管理包含三类工具:dpkg.apt和aptitude.1 dpkg 主要是对本地的软件包进行管理,本地软件包包括已经在本地安装的软件包和已经下载但还没有安装的 deb 文件,不解决依赖关 ...

  8. Prototype-based programming

    Prototype-based programming is a style of object-oriented programming in which behaviour reuse (know ...

  9. MySQL_索引原理与慢查询优化

    索引原理与慢查询优化 创建/删除索引的语法 #方法一:创建表时 CREATE TABLE 表名 ( 字段名1 数据类型 [完整性约束条件…], 字段名2 数据类型 [完整性约束条件…], [UNIQU ...

  10. 省选模板_STL

    目录: 1. multiset 2. reverse 1.multiset namespace STL{ int main(){ multiset<int>::iterator s; mu ...