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 抽象的练习的更多相关文章

  1. 理解Java中的抽象

    在计算机科学中,抽象是一种过程,在这个过程中,数据和程序定义的形式与代表的内涵语言相似,同时隐藏了实现细节. 抽象:一个概念或者想法不和任何特定的具体实例绑死. 目录 什么是抽象 抽象的形式 如何在J ...

  2. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  3. [Java并发] AQS抽象队列同步器源码解析--锁获取过程

    要深入了解java并发知识,AbstractQueuedSynchronizer(AQS)是必须要拿出来深入学习的,AQS可以说是贯穿了整个JUC并发包,例如ReentrantLock,CountDo ...

  4. [Java并发] AQS抽象队列同步器源码解析--独占锁释放过程

    [Java并发] AQS抽象队列同步器源码解析--独占锁获取过程 上一篇已经讲解了AQS独占锁的获取过程,接下来就是对AQS独占锁的释放过程进行详细的分析说明,废话不多说,直接进入正文... 锁释放入 ...

  5. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  6. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  7. 黑马程序员——JAVA基础之抽象和接口 , 模版方法设计模式

    ------- android培训.java培训.期待与您交流! ---------- 抽象定义:           抽象就是从多个事物中将共性的,本质的内容抽取出来.           例如:狼 ...

  8. 菜鸟版JAVA设计模式-从抽象与实现说桥接模式

    桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...

  9. [译]Java 设计模式之抽象工厂

    (文章翻译自Java Design Pattern: Abstract Factory) 抽象工厂模式针对工厂模式增加了抽象层.如果我们使用抽象工厂模式和工厂模式比较的话,很明显抽象工厂模式增加了一个 ...

  10. Java 继承、抽象、接口

    一.继承 1. 概述 继承是面向对象的重要特征之一,当多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那多个类中无需再定义这些属性和行为,只需继承那个单独的类即可. 单独的类称为父类或超 ...

随机推荐

  1. 【特别推荐】Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  2. Sass学习之路(4)——不同样式风格的输出方式

    因为每个前端工程师编写代码的风格都不太一样,所以Sass的编译也非常人性化的提供了不同风格的编译方式,主要分为4种. 比如下面这一段Sass代码,我们来看看在不同风格下,会编译成什么样吧: nav { ...

  3. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  4. SharePoint 如何找到List的Template ID

    在我们添加Ribbon操作,或者对特定模板进行操作的时候,经常需要ListTemplate的数值,我们经常需要搜索各种网页,来查找匹配的ListTemplate值,其实,有个比较简便的方法. 像定义R ...

  5. Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单

    在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介 ...

  6. Android项目实战(九):CustomShapeImageView 自定义形状的ImageView

    一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/Custo ...

  7. iOS 清理缓存功能实现第一种方法

    添加一个提示框效果导入第三方MBProgressHUD #import "MBProgressHUD+MJ.h" /** * 清理缓存第一种方法 */ -(void)clearCa ...

  8. iOS开发笔记9:NSUserDefaults存储自定义实体对象

    NSUserDefaults常常用来本地存储一些简单的数据,例如用户信息等等,NSUserDefaults支持floats.doubles.integers.Booleans.URLs.NSData. ...

  9. 阿里云上安装vsftp笔记

    安装 ftp 1 ssh登录服务器       首先检查有没有安装运行 ps -ef |grep vsftpd         2 yum安装vsftpd        yum安装    yum in ...

  10. SpringMVC4 + Spring + MyBatis3 基于注解的最简配置

    本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: Dispatc ...