java 8-6 抽象的练习
1、 猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭
分析:从具体到抽象
猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(猫吃鱼)
狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(狗吃肉)
因为有共性的内容,所以就提取了一个父类。动物。
但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
而方法是抽象的类,类就必须定义为抽象类。
抽象动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();
实现:从抽象到具体
动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();
狗类:
继承自动物类
重写吃饭();
猫类:
继承自动物类
重写吃饭();
//定义抽象的动物类
abstract class Animal3{ //定义成员变量
private String name;
private int age; //抽象吃类,必须要进行的方法
abstract void eat(); //构造方法
//无参
public Animal3(){}
//有参
public Animal3(String name,int age){
this.name = name;
this.age = age;
} //get Xxx set Xxx
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
} } //定义狗类
class Dog3 extends Animal3{
//无参 必须要 , 测试类才能够调用
public Dog3(){};
//有参构造方法
public Dog3(String name, int age){
super(name, age);
} public void eat(){
System.out.println("狗吃肉么");
}
//特有的方法
public void look(){
System.out.println("哈士奇能看门?");
}
} //定义猫类
class Cat3 extends Animal3{
//构造方法,无参,有参
public Cat3(){};//必须要
public Cat3(String name,int age){
super(name, age);
}
//成员方法
public void eat(){
System.out.println("猫吃鱼吖");
}
//特有的方法
public void pa(){
System.out.println("猫爬树厉害");
}
} //测试类 class AbstractTest1{
public static void main(String[] args){ //方法1 具体类用法
Cat3 c = new Cat3();
c.setName("波斯猫");
c.setAge(2);
System.out.print(c.getName()+"\t"+c.getAge()+"\t");
c.eat();
System.out.println("----------"); //方式2 具体类用法
Dog3 d = new Dog3("哈士奇",1);
System.out.print(d.getName()+"\t"+d.getAge()+"\t");
d.eat();
System.out.println("----------"); //方法3 多态方法
//先定义为猫
Animal3 a = new Cat3();
a.setName("短尾猫");
a.setAge(1);
System.out.print(a.getName()+"\t"+a.getAge()+"\t");
a.eat();
System.out.println("----------");
//向下转换 使其能调用猫类特有的方法
Cat3 a1 = (Cat3) a;
a1.pa();
System.out.println("----------"); //转换为狗类
a = new Dog3("二哈",1);
System.out.print(a.getName()+"\t"+a.getAge()+"\t");
a.eat();
System.out.println("----------");
//向下转换 使其能调用狗类特有的方法
Dog3 d1 = (Dog3) a;
d1.look();
}
2、 老师案例
具体事物:小学老师,大学老师
共性:姓名,年龄,讲课。
不同:大学老师比小学老师多了一条成员变量、
分析:
小学老师
姓名,年龄
讲课。
大学老师
姓名,年龄
讲课。
实现:
老师类
小学老师
大学老师
//定义抽象的老师类
abstract class Teacher{ //成员变量
private String name;
private int age; //构造方法
//无参
public Teacher(){}
//有参
public Teacher(String name,int age){
this.name = name;
this.age = age;
} //getXxx,setXxx方法
public String getName(){
return name ;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
} //抽象方法 方法为空
public abstract void teacher();
//成员方法
public void eat(){
System.out.println("吃饭");
} } //定义小学老师类
class xiaoTeacher extends Teacher{
//构造方法
//无参
public xiaoTeacher(){}
//有参
public xiaoTeacher(String name,int age){
super(name,age);
}
//成员方法
public void teacher(){
System.out.println("教小学");
}
//特有的方法
public void zhaogu(){
System.out.println("照顾小孩子");
}
} //定义大学老师类
class daTeacher extends Teacher{
//构造方法
private int money;//大学老师比小学老师多了一项收入,项目收入
public daTeacher(){}
public daTeacher(String name,int age,int money){
super(name,age); //这2项走父类Teacher的
this.money = money;//money走自己这边的
}
//money的set和get
public int getMoney(){
return money;
}
public void setMoney(int money){
this.money = money;
}
//成员方法
public void teacher(){
System.out.println("教大学");
}
//特有方法
public void yanjiu(){
System.out.println("做研究或项目");
}
} //测试类
class AbstractTest2{
//具体方法1
public static void main(String[] args){
xiaoTeacher x = new xiaoTeacher();
x.setName("张三");
x.setAge(24);
System.out.println(x.getName()+"\t"+x.getAge());
x.teacher();
x.zhaogu();
x.eat();
System.out.println("--------------"); //具体方法2
daTeacher d = new daTeacher("李四",32,5000);
System.out.println(d.getName()+""+d.getAge()+"\t项目收入:"+d.getMoney());
d.teacher();
d.yanjiu();
x.eat();
System.out.println("--------------"); //多态方法
//先小学
Teacher a = new xiaoTeacher();
a.setName("小张");
a.setAge(24);
System.out.println(a.getName()+"\t"+a.getAge());
a.teacher();
a.eat();
//向下转换
xiaoTeacher a1 = (xiaoTeacher) a;
a1.zhaogu();
System.out.println("--------------"); //转大学
a = new daTeacher("老李",32,5000);
a.teacher();
System.out.println(a.getName()+"\t"+a.getAge());
System.out.println("--------------");
//向下转型
daTeacher a2 = (daTeacher)a;
a2.yanjiu();
System.out.println(a2.getName()+"\t"+a2.getAge()+"\t项目收入:"+a2.getMoney());
a.eat();
}
}
java 8-6 抽象的练习的更多相关文章
- 理解Java中的抽象
在计算机科学中,抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节. 抽象:一个概念或者想法不和任何特定的具体实例绑死. 目录 什么是抽象 抽象的形式 如何在J ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- [Java并发] AQS抽象队列同步器源码解析--锁获取过程
要深入了解java并发知识,AbstractQueuedSynchronizer(AQS)是必须要拿出来深入学习的,AQS可以说是贯穿了整个JUC并发包,例如ReentrantLock,CountDo ...
- [Java并发] AQS抽象队列同步器源码解析--独占锁释放过程
[Java并发] AQS抽象队列同步器源码解析--独占锁获取过程 上一篇已经讲解了AQS独占锁的获取过程,接下来就是对AQS独占锁的释放过程进行详细的分析说明,废话不多说,直接进入正文... 锁释放入 ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- 黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式
------- android培训.java培训.期待与您交流! ---------- 抽象定义: 抽象就是从多个事物中将共性的,本质的内容抽取出来. 例如:狼 ...
- 菜鸟版JAVA设计模式-从抽象与实现说桥接模式
桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...
- [译]Java 设计模式之抽象工厂
(文章翻译自Java Design Pattern: Abstract Factory) 抽象工厂模式针对工厂模式增加了抽象层.如果我们使用抽象工厂模式和工厂模式比较的话,很明显抽象工厂模式增加了一个 ...
- Java 继承、抽象、接口
一.继承 1. 概述 继承是面向对象的重要特征之一,当多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那多个类中无需再定义这些属性和行为,只需继承那个单独的类即可. 单独的类称为父类或超 ...
随机推荐
- 七年IT生涯的经验教训
七年IT生涯的经验教训[转]我在IT界也拼打了有好几年了,但是现在和别人比较起来不是很如意.从天分上来说,我在属于智商不低的人:从技术上说,几乎没有我拿不下的:从见解上看,我是很有点子看法的人. ...
- [Tool] 使用StyleCop验证命名规则
[Tool] 使用StyleCop验证命名规则 前言 微软的MSDN上,有提供了一份微软的命名方针,指引开发人员去建立风格一致的程序代码. http://msdn.microsoft.com/zh-t ...
- 推荐几个的chorme的扩展程序
下面来解释下这几个插件 (0)Context : 管理这些乱七八糟的扩展程序,插件用的时候,点开,不用的时候,关闭,这样可以降低游览器的负荷 (1)AngularJS Batarang : 测试ang ...
- swift学习笔记之-枚举
//枚举定义 import UIKit //枚举定义 (枚举.结构体.类的名字首字母必须大写,表示为定义了新的类型) /*枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来 ...
- 微信公共平台开发3 .net
嗯,别的不说了现在开始接着上次http://www.cnblogs.com/QLJ1314/p/3838058.html 获取ACCESSTOKEN,开始吧,接下来我们就写发送文本消息吧. 首先建立 ...
- jQuery高级技巧——性能优化篇
通过CDN(Content Delivery Network)引入jQuery库 要提升网站中javascript的性能的最简单的一步就是引入最新版本的jQuery库,新发布的版本通常在性能上会有 ...
- Access sql语句创建表及字段类型
创建一张空表: Sql="Create TABLE [表名]" 创建一张有字段的表: Sql="Create TABLE [表名]([字段名1] MEMO NOT NUL ...
- 穷举法破解 zebrone1.1
系统 : Windows xp 程序 : zebrone1.1 程序下载地址 :http://pan.baidu.com/s/1boqVcU7 要求 : 编写注册机 使用工具 :OD 可在看雪论坛中查 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- [android] 手机卫士自定义控件的属性
上一节完成的自定义组合控件,灵活性不够,控件的显示信息上,仿照系统属性,自定义自己的属性 上一节组合控件SettingItemView中有三个控件,分别是TextView大标题,TextView描述, ...