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. 总结一下SQL的全局变量

    SQL Server 2008中的全局变量及其用法 T-SQL程序中的变量分为全局变量和局部变量两类,全局变量是由SQL Server系统定义和使用的变量.DBA和用户可以使用全局变量的值,但不能自己 ...

  2. (四)play之yabe项目【页面】

    (四)play之yabe项目[页面] 博客分类: 框架@play framework   主页面 显示当前发表博客的完整内容,以及历史博客列表 Bootstrap Job 一个play job任务就是 ...

  3. 解决SSIS中的脚本任务无法调试的问题

    开发环境:操作系统环境为Win7 64Bit,数据库为SQLServer2008R2 问题现象:在SSIS的项目工程中,新建Package包,新建脚本任务,编写脚本程序以后,设置断点无法调试(Debu ...

  4. android开发之——获取相册图片和路径

    Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managed ...

  5. iOS之UI--关于modal

    modal的效果展示: 关于modal的涉及到的知识点: 1.当一个控制器被销毁的时候,它里面所有子控制器的业务逻辑都不能够处理 2.当一个控制器被销毁的时候,它里面所有子控件的业务逻辑都不能够处理 ...

  6. 做一些Spring AOP做过的事,封装 jdk动态代理成为一个黑盒子

      怎么使用eclise 抽取方法,请看  利用eclipse 抽取代码片段为方法   抽取完成之后,还需要 ① 将Collection.class换成  target.getClass(),targ ...

  7. 评价网站UI--北京邮电大学首页

    首页给人的第一个印象是直观简洁,色调舒适.背景为北邮校内特色建筑美景,令人赏心悦目. 从布局看,结构层次分明.“北京邮电大学”及其校徽清晰明朗却不显突兀.并列着四个大标题:“北邮概况”.“学在北邮”. ...

  8. 【重构】 利用 cos 组件实现jsp中上传附件

    利用JSP&Servlet重构项目 利用 cos 组件实现jsp中上传附件 fileUpload.jsp --> FileUploadController.java --> fil ...

  9. javascript简介和基本语法

    javascript简介 1.javascript是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 用法:为了保险起见一般写在</html>之后<javascript   ...

  10. JS中的bind方法学习

    EcmaScript5给Function扩展了一个方法:bind 众所周知 在jQuery和prototype.js之类的框架里都有个bind jQuery里的用途是给元素绑定事件 $("# ...