Java学习笔记二十九:一个Java面向对象的小练习
一个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面向对象的小练习的更多相关文章
- Java学习笔记(十九)——Java 日志记录 AND log4j
[前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...
- Java学习笔记二十二:Java的方法重写
Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...
- Java学习笔记(十六)——Java RMI
[前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- 【Java学习笔记之十九】super在Java继承中的用法小结
1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量: 2)在一个构造函数中调用另外一 ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
随机推荐
- Sql Server关于日期查询时,如果表中日期到具体某个时间
1.如果查询日期参数为'2017/02/21',而数据库表中的字段为'2017/02/21 12:34:16.963',则需要格式化一下日期才能查询出来,如下 select * from table ...
- SQL Server Management Studio 2012 键盘快捷键(转)
无论是对于DBA还是Developer,键盘快捷键都是很常用的,动动键盘可比鼠标快多了,不过SQL Server 2012对SSMS(SQL Server Management Studio)中的快捷 ...
- cocos ide使用binding-generator导出来的c++类
time:2015/03/19 cocos版本:3.2 描述:用了ide运行一个实例[1]的时候需要增加c++类,正确导出来之后,直接使用vs2012启动是没有问题的,但是使用ide启动却提示找不到模 ...
- ZT I Believe I Can Fly(我相信我能飞)
I Believe I Can Fly(我相信我能飞) 歌手:R. Kelly(罗 凯利) 歌词部分 I used to think that I could not go on 我原以为我无法坚持下 ...
- Python 处理脚本的命令行参数-getopt
# -*- coding:utf-8 -*- import sys def test(): """ 参数列表:sys.argv 参数个数:len(sys.argv) 脚本 ...
- IOS 对JSON解析的要求
JOSN格式的原始字符串中, 键名必须为 引号 “” 包含的字符串,值必须是数组("[]" 用中括号包起来的部分),字典("{}" 用中括号包起来的部分),数字 ...
- JavaScript 数组遍历方法的对比
JavaScript 发展至今已经发展出多种数组的循环遍历的方法,不同的遍历方法运行起来那个比较快,不同循环方法使用在那些场景,下面将进行比较: 各种数组遍历的方法 for 语句 ,,,] , len ...
- 编程算法 - 数字在排序数组中出现的次数 代码(C)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/36869869 数字在排序数组中出现的次数 代 ...
- 【Webpack】学习随笔
参考链接:http://www.runoob.com/w3cnote/webpack-tutorial.html Webpack 是一个前端资源加载/打包工具. Webpack 可以将多种静态资源 j ...
- EF和linq to sql 关系
LINQ to SQL 允许你用任何类来代表数据库中的数据.表.同样的,EF也允许你用任何类来代表苏据库中的数据.表. 所不同的的地方是Linq to sql 用这些被修饰过的类直接同数据库打交道,存 ...