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. HTTP路由

    HTTP路由 HTTP路由(译者注:Play的路径映射机制)组件负责将HTTP请求交给对应的action(一个控制器Controller的公共静态方法)处理. 对于MVC框架来说,一个HTTP请求可以 ...

  2. Ansible用于网络设备管理 part 1 Jinja2 YAML初窥

    这一次的实验内容依然来自Kirk Byers的博客,源地址在https://pynet.twb-tech.com/blog/python/paramiko-ssh-part1.html 但是,这次实验 ...

  3. 模拟Select-Options对象实现多项数据输入功能

       模拟Select-Options对象实现多项数据输入功能 Select-Options对象可以同时输入多项值并将所输入数据存入内表以供程序使用,不过Select-Options的功能有一定的局限 ...

  4. 可展开的列表组件——ExpandableListView深入解析

    可展开的列表组件--ExpandableListView深入解析 一.知识点 1.ExpandableListView常用XML属性 2.ExpandableListView继承BaseExpanda ...

  5. IOS Quartz2D简介

    Quartz2D 简介( 后续会有相关应用) 第一部分 绘制直线 代码示例: - (void)drawRect:(CGRect)rect{ //获取图形上下文 CGContextRef cxConte ...

  6. 【原】UIView实现点击着重效果的解决方案

    我们知道,在IOS中UIButton UIControl都有一个默认的选中效果,即点中后会图标会变暗,移开后又恢复正常.如何让UIView UIImageView等这些普通的view也实现同样的效果呢 ...

  7. iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解

    一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...

  8. Android 网络编程基础之简单聊天程序

    前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...

  9. 快速与MySQL交互,使用XMAPP打开MySQL数据库,并用shell进行与MySQL交互<Window 10>

    1.如果想要通过XAMPP shell登录MySQL,还需要下载安装好XAMPP. 2.双击打开xampp-control.exe,会出现以下界面,点击开启Apache和MySQL,这样我们就开启服务 ...

  10. Gleeo Time Tracker简明使用教程

    转载一篇很不错的文章,这款软件还是非常实用的 1 简介 Gleeo Time Tracker是安卓平台下一款相当酷的项目时间记录和管理的软件.说他酷,是因为界面纯黑.而除了这点酷之外,功能也很简单实用 ...