一个Java面向对象的小练习

一:项目需求与解决思路;

  学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性:

  1.人类都有说话的能力,那我们可不可以使用计算机程序来描述其特征呢。

  2.如果是中国人,那么他的语言能力就直接输出中国人说中国话、如果是美国人,那么他的语言能力就直接输出美国人说美国话。

  3.分别在测试类中创建两个对象,创建了中国人对象的话,他应该说的是中国话,创建了美国人的话,他应该说的是英语。

  4.那么如何用我们的面向对象知识实现这一特点呢,

  5.首先我们分析一下,中国人和美国人都是人类,也就是我们说的 is a 关系,那我可不可以用到面向对象的继承关系呢,只不过中国人的语言能力我们要输出中国人说中国话,美国人的语言能力我们要输出美国人说英语,显然如果我要写成继承的关系的话,有人类这样一个父类,但是人类这个父类里的语言能力满足不了我们的需求,因为我们发现子类中都有自己的语言能力,那现在怎么办呢,我们是不是就可以用到面向对象中的重写方法特性呢,我们知道,如果父类无法满足子类的需求那么我们就重写从父类继承来的方法,我们是不是就可以解决这个问题了呢,

  6.最终我们在创建两个对象的时候,我们可以思考一下这个问题,我可不可以用多态的特性来解决这个问题呢,因为不管是中国人也好美国人也好他们都是人类,我们可不可以用父类的引用指向子类的对象呢,那结合以上我们分析的特点,我们的程序就写出来了。

  7.所以我们写的任何一个程序我们都要思考能否用前面学习的方法来实现。

  我们来看一下代码如何实现:

二:代码的实现与优化;

  1.我们先创建一个工程,名为Demo;

  2.那我们说中国人和美国人都是人,所以我们应该有一个人类的父类,我们取名为Person类:当然要加我们的包名;

  3.那人类有什么能力呢,当然有说话的能力,我们定义一个say()方法;

  4.那么中国人也是人,美国人也是人,他们要继承于Person这个父类,我们再来创建一个子类;

当然我们需要继承父类,所以修改代码为;

  显然,子类虽然有说话的能力,但是满足不了我们的需求,所以我们要重写子类的方法,代码如下;

package com.demo;

public class Chinese extends Person{

    public void say(){
System.out.println("中国人说中国话");
}
}

  我们的第二个子类也如上;

代码如下:

package com.demo;

public class American extends Person{

    public void say(){
System.out.println("美国人说英语");
} }

  5.现在我们写一个测试类;

代码如下:

package com.demo;

public class Test {

    public static void main(String[] args) {
// TODO Auto-generated method stub Chinese p = new Chinese();//创建一个对象通过引用p指向它
American p2 = new American();//创建一个对象通过引用p2指向它
p.say();
p2.say();
} }

运行结果为:

  6.那我们发现中国人和美国人都是人,我们可不可以用父类的引用指向子类的对象呢,用上我们多态的语法,当然是可以的,代码如下:

package com.demo;

public class Test {

    public static void main(String[] args) {
// TODO Auto-generated method stub Person p = new Chinese();//创建一个对象通过引用指向它
Person p2 = new American();//创建一个对象通过引用指向它
p.say();
p2.say();
} }

注:只有两个类有继承关系的时候才能使用多态;

运行结果为:

  7.那我们再来想一想可不可以用更好的方法来实现这个程序呢,因为Person类其实只是充当了一个制定规则的父类,我们还可以使用抽象类来表示!因为我们只是用Person类充当父类制定规则,并不会用到Person类中的方法;

  先创建一个类;

代码如下:

package com.demo;

public abstract class APerson {

    //方法声明
public abstract void say();
}

我们继续修改子类让其继承抽象类APerson;

package com.demo;

public class Chinese extends APerson{

    public void say(){
System.out.println("中国人说中国话");
}
}
package com.demo;

public class American extends APerson{

    public void say(){
System.out.println("美国人说英语");
} }
package com.demo;

public class Test {

    public static void main(String[] args) {
// TODO Auto-generated method stub APerson p = new Chinese();//创建一个对象通过引用指向它
APerson p2 = new American();//创建一个对象通过引用指向它
p.say();
p2.say();
} }

运行结果为:

  那么我们的运行结果虽然是一样的,但是我们的代码更合理了!

Java学习笔记二十九:一个Java面向对象的小练习的更多相关文章

  1. Java学习笔记(十九)——Java 日志记录 AND log4j

    [前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...

  2. Java学习笔记二十二:Java的方法重写

    Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...

  3. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

  4. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  5. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  6. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  7. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  8. 【Java学习笔记之十九】super在Java继承中的用法小结

    1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量: 2)在一个构造函数中调用另外一 ...

  9. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

随机推荐

  1. MySQL高可用架构之Keepalived+主从架构部署

    针对目前公司的数据库架构要做统计规划和调整,所以针对不同的业务环境要选择合适的架构就比较重要,同时作为运维人员又要考虑到维护的便捷性(不能做过多架构维护),最终停留在mha+vip/主从+vip/my ...

  2. 三、python小功能记录——杀掉进程

    import os os.system("taskkill /F /IM python.exe")#旧版 os.system("taskkill /F /IM py.ex ...

  3. Java学习---InetAddress类的学习

    基础知识 1.InetAddress类 在网络API套接字,InetAddress类和它的子类型对象使用域名DNS系统,处理主机名到主机IPv4或IPv6地址的转换.如图1-1所示. 由于InetAd ...

  4. 如何恢复在Windows 10中被永久删除的照片?

    照片被误删除了需要恢复?这里推荐一款软件:winutilities.使用WinUtilities文件恢复向导允许您通过简单的点击恢复已删除的照片或从Windows 10回收站中恢复被删除的照片. 恢复 ...

  5. cheerio数据抓取

    很多语言都能写个爬虫抓取数据,js自然也可以,使用cheerio可以支持css检索,较快捷的获取需要的数据.首先,先把node.js给安装了.可到官网下载.安装好node.js后,使用npm安装che ...

  6. oracle imp 报12154错误解决办法

    imp test/test@orcl file=/backup.dmp full=y --报错   imp test/test@127.0.0.1/orcl file=/backup.dmp full ...

  7. Java HttpURLConnection模拟请求Rest接口解决中文乱码问题

    转自:http://blog.csdn.net/hwj3747/article/details/53635539 在Java使用HttpURLConnection请求rest接口的时候出现了POST请 ...

  8. POJ3304 Segments

    嘟嘟嘟 题面就不说了,网上都有. 刚开始理解成了只要有不孤立的线段就算合法,结果就不会了--然而题中要求是所有线段至少有一个交点. 其实想一想就知道,问题转化为了是否存在一条直线和所有线段都有交点. ...

  9. programming-languages学习笔记--第6部分

    programming-languages学习笔记–第6部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} program ...

  10. 20165302 实验一 java开发环境的熟悉

    20165302实验一 java开发环境的熟悉 一,实验内容与步骤 1.命令行下java程序开发 ①待编译运行代码 package csj; import java.util.Scanner; pub ...