上一篇(http://blog.csdn.net/qq_32059827/article/details/51334198)对抽象类做了一些描述,这一篇根据两个案例加深一下印象。会觉得抽象类其实不抽象:

案例一:猫狗案例。

/*
猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭 分析:从具体到抽象
猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(猫吃鱼) 狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(狗吃肉) 因为有共性的内容,所以就提取了一个父类。动物。
但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
而方法是抽象的类,类就必须定义为抽象类。 抽象动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();是抽象的 实现:从抽象到具体
动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(); 狗类:
继承自动物类
重写吃饭(); 猫类:
继承自动物类
重写吃饭();
*/
//定义抽象的动物类
abstract class Animal {
//姓名
private String name;
//年龄
private int age; public Animal() {} public Animal(String name,int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //定义一个抽象方法
public abstract void eat();
} //定义具体的狗类
class Dog extends Animal {
public Dog() {} public Dog(String name,int age) {
super(name,age);//访问父类中的有参构造方法,用super关键字。
} public void eat() {//子类方法重写
System.out.println("狗吃肉");
}
} //定义具体的猫类
class Cat extends Animal {
public Cat() {} public Cat(String name,int age) {
super(name,age);
} public void eat() {//子类方法重写
System.out.println("猫吃鱼");
}
} //测试类
class AbstractTest {
public static void main(String[] args) {
//测试狗类
//具体类用法
//方式1:
Dog d = new Dog();
d.setName("旺财");//继承自父类
d.setAge(3);//继承自父类
System.out.println(d.getName()+"---"+d.getAge());
d.eat();
//方式2:
Dog d2 = new Dog("旺财",3);//super那边
System.out.println(d2.getName()+"---"+d2.getAge());
d2.eat();
System.out.println("---------------------------"); //使用多态的方式
Animal a = new Dog();
a.setName("旺财");
a.setAge(3);
System.out.println(a.getName()+"---"+a.getAge());
a.eat(); Animal a2 = new Dog("旺财",3);
System.out.println(a2.getName()+"---"+a2.getAge());
a2.eat();
System.out.println("---------------------------");
a = new Dog("露露",12);
System.out.println(a.getName()+"---"+a.getAge());
a.eat();
System.out.println("---------------------------");
//练习:测试猫类
//方式一
Cat c = new Cat();
c.setName("小花");
c.setAge(5);
System.out.println(c.getName()+"---"+c.getAge());
c.eat();
System.out.println("---------------------------");
//方式二
Cat c1 = new Cat("xiaohua",4);
System.out.println(c1.getName()+"---"+c1.getAge());
c1.eat();
System.out.println("---------------------------");
//多态实现
//方式一
Animal a3 = new Cat();
a3.setName("小花");
a3.setAge(5);
System.out.println(a3.getName()+"---"+a3.getAge());
a3.eat();
System.out.println("---------------------------");
//方式二
Animal a4 = new Cat("xiaohua",4);//注意这里书写的方式与老师上面讲解方式的不同,这里相当于给a3(重新分配了地址)(因为new了一下)。但是用了(同一个变量)a3,正确
System.out.println(a4.getName()+"---"+a4.getAge());
a4.eat();
System.out.println("---------------------------");
a3 = new Cat("tom",9);
System.out.println(a3.getAge()+"----"+a3.getName());
a3.eat();
}
}

案例二:公司职员案例:

/*

	实现:
员工类:
普通员工类:
经理类:
*/
//定义员工类
abstract class Employee {
//姓名、工号以及工资
private String name;
private String id;
private int salary; public Employee() {} public Employee(String name,String id,int salary) {
this.name = name;
this.id = id;
this.salary = salary;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public int getSalary() {
return salary;
} public void setSalary(int salary) {
this.salary = salary;
} //工作,工作内容不一样,定义一个抽象方法,在子类中必须要有方法重写
public abstract void work();
} //普通员工类
class Programmer extends Employee {
public Programmer(){} public Programmer(String name,String id,int salary) {
super(name,id,salary);
} public void work() {
System.out.println("按照需求写代码");
}
} //经理类
class Manager extends Employee {
//奖金,经理独有的属性
private int bonus; //bonus 奖金 public Manager(){} public Manager(String name,String id,int salary,int bonus) {
super(name,id,salary);
this.bonus = bonus;//this代表本类的成员
} public void work() {//父类工作的抽象方法子类要有方法重写
System.out.println("跟客户谈需求");
} public int getBonus() {
return bonus;
} public void setBonus(int bonus) {
this.bonus = bonus;
}
} class AbstractTest4 {
public static void main(String[] args) {
//测试普通员工,利用多态实现
Employee emp = new Programmer();
emp.setName("林青霞");
emp.setId("001");
emp.setSalary(8000);
System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
emp.work();
System.out.println("-------------");
emp = new Programmer("林青霞","001",8000);//重新分配地址,重新分配内存空间
System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
emp.work();
System.out.println("-------------"); //由于子类有特有的内容,所以不采用多态方式
Manager m = new Manager();
m.setName("小吴");
m.setId("002");
m.setSalary(8000);
m.setBonus(2000);
System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getBonus());
m.work();
System.out.println("-------------"); //通过构造方法赋值
m = new Manager("刘意","czbk002",8000,2000);
System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
m.work();
}
}

《java入门第一季》之面向对象(抽象类其实不抽象)的更多相关文章

  1. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  2. Java入门第一季——从此投身Java??

    找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简 ...

  3. 《java入门第一季》之面向对象(谈谈接口)

    软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的 ...

  4. Java入门第一季

    慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...

  5. 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

    根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: ...

  6. 《java入门第一季》之面向对象(抽象类到底多抽象)

    /* 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须被称为是抽象类. 抽象类的特点: ...

  7. 《java入门第一季》之面向对象(包概述)

    由于eclipse等ide的强大功能,使得建包,导包用一些快捷键就能完成.这里对包的概念做稍微的叙述,了解即可: 分包后使得项目更加清晰,提高代码维护性. 包:         A:其实就是文件夹   ...

  8. 《java入门第一季》之面向对象(接口收尾)

    通过案例的形式,结束接口部分. /* 猫狗案例,加入跳高的额外功能 分析:从具体到抽象 猫: 姓名,年龄 吃饭,睡觉 狗: 姓名,年龄 吃饭,睡觉 由于有共性功能,所以,我们抽取出一个父类: 动物: ...

  9. 《java入门第一季》之面向对象多态面试题(多态收尾)

    /* 看程序写结果:先判断有没有问题,如果没有,写出结果 */ class A { public void show() { show2(); } public void show2() { Syst ...

随机推荐

  1. 粗浅看Struts2和Hibernate框架

    ----------------------------------------------------------------------------------------------[版权申明: ...

  2. pandas小记:pandas高级功能

    http://blog.csdn.net/pipisorry/article/details/53486777 pandas高级功能:面板数据.字符串方法.分类.可视化. 面板数据 {pandas数据 ...

  3. Hibernate与JPA的区别是什么

    翻译来源:https://www.quora.com/What-is-the-difference-between-Hibernate-and-JPA 本文作者:苏生米沿 本文地址:http://bl ...

  4. Activtiy完全解析(三、View的显示过程measure、layout、draw)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52840065 本文出自:[openXu的博客]   在Activity完全解析的第一篇文章A ...

  5. Android底层开发经验

    最近看到一个博客,他的博文虽然是转载的,但源作者肯定对底层的理解可谓是非常透彻,一副思维导图就可以将整个重要体系建立起来,非常适合大家学习.学习不单单只要有代码,生动有趣更重要.在此推荐一波: htt ...

  6. 剑指Offer——知识点储备--Linux基本命令+Makefile

    剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...

  7. github pages + Hexo + 域名绑定搭建个人博客增强版

    概述 前面我们用github pages + Hexo 搭建了一个简单版的个人博客系统,但是里面的内容单调,很多功能不够完善,所以我们需要对yelle 的主题进行优化和完善.基本搭建请访问:http: ...

  8. windows系统下安装和使用ROS的解决方案 (1 win_ros 2 rosserial_windows)

    具体请参考官网: 1  http://wiki.ros.org/win_ros 2  https://github.com/ros-windows/win_ros 3  http://wiki.ros ...

  9. Struts 1 之<logic>标签库

    1. logic:empty logic:empty标签是用来判断是否为空的.如果为空,该标签体中嵌入的内容就会被处理.该标签用于以下情况: 当Java对象为null时 当String对象为" ...

  10. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...