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运算 ...
随机推荐
- 【Leetcode】【hard】Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- ubuntu13.04更新源
最近163的源出问题了,又要换一次源. 报错如下: 查更新源的命令查了好多次,这次还是记下来吧,估计以后还会用到很多次. 常规来说,是要先备份的,不过感觉备份也没什么用,所以就直接跳过吧.. 1 打 ...
- January 13 2017 Week 2 Friday
Those who turn back never reach the summit. 回头的人永远也到不了顶峰. I always turned back on my life road, so i ...
- HTTP协议图--与 HTTP 协作的 Web 服务器
HTTP 通信时,除客户端和服务器外,还有一些用于协助通信的应用程序.如下列出比较重要的几个:代理.缓存.网关.隧道.Agent 代理. 1.代理 代理 HTTP 代理服务器是 Web 安全.应用 ...
- js url传值中文乱码完美解决(JAVA)
js url传值中文乱码完美解决(JAVA) 首先在你的jsp页面这样更改: var url="你要传入的Action的位置&ipid="+ipid+"& ...
- iOS开发中的Markdown渲染
iOS开发中的Markdown渲染 BearyChat的消息是全面支持Markdown语法的,所以在开发BearyChat的iOS客户端的时候需要处理Markdown的渲染. 主要是两套实现方案: 直 ...
- 一句话解释:C2C / B2C / O2O / B2B
C2C (Customers To Customers):个人到个人,就是我卖东西你来买B2C (Business To Customers):公司到个人,就是我成立个公司卖东西,你来买O2O (On ...
- deque详解
deque是double-ended queue的简称,deque和vector几乎上是一样的,使用的非常少,定义在<deque>头文件里: deque和vector的区别在于: 1)de ...
- Unity3D-飞机拖尾效果
1.插件准备 unity3d官网,Assert Store搜索Cartoon_airplane 插件 2.拖尾效果实现 飞机显示 拖尾组件设计 在airplane_02下 右键 Effects-Tra ...
- springboot项目用maven打jar包
clean package -Dmaven.test.skip=true idea eclipse STS