码迷,mamicode.com
首页 > 编程语言 > 详细

java之抽象类

时间:2016-10-06 23:03:28      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:java之抽象类

1.抽象类概述

package com;
class Animal{
	public void eat(){
		System.out.println("动物吃东西");
	}
	public void sleep(){
		System.out.println("动物睡觉");
	}
}
class Dog extends Animal{
	@Override
	public void eat(){
		System.out.println("猫吃东西");
	}
	@Override
	public void sleep(){
		System.out.println("猫睡觉");
	}
}
class Cat extends Animal{
	@Override
	public void eat(){
		System.out.println("狗吃东西");
	}
	@Override
	public void sleep(){
		System.out.println("狗睡觉");
	}
}
public class AnimalTest {
	public static void main(String[] args) {
		Animal a = new Dog();
		a.eat();
		
	}
}

  从上面的代码,我们开始思索。动物不是一个具体的事物,而是一个抽象的事物。只有真正的猫、狗才是具体的动物。同理,我们可以推想,不同的动物吃的东西也应该是不一样的。所以,我们不应该在动物类中给出具体的实现细节,而是应该给出一个声明即可。在Java中,一个没有方法体的方法应该被定义为抽象方法,而类中如果有抽象方法,那么该类被称为抽象类。


2.抽象类特点

  抽象类和抽象方法必须用abstract关键字修饰。

  格式:

    abstract class 类名{}

    public abstract void eat();

  抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。

  抽象类不能被实例化。因为它不是具体的。抽象类有构造方法,但是不能实例化?那么构造方法的作用是什么?用于子类访问父类数据的初始化。

  抽象类的子类,要么是抽象类,要么实现抽象类中的所有抽象方法。

package com;
abstract class Animal{
	public abstract void eat();
	public abstract void sleep();
}
class Dog extends Animal{
	@Override
	public void eat(){
		System.out.println("猫吃东西");
	}
	@Override
	public void sleep(){
		System.out.println("猫睡觉");
	}
}
class Cat extends Animal{
	@Override
	public void eat(){
		System.out.println("狗吃东西");
	}
	@Override
	public void sleep(){
		System.out.println("狗睡觉");
	}
}
public class AnimalTest {
	public static void main(String[] args) {
		Animal a = new Dog();//多态
		a.eat();
		
	}
}


3.抽象类成员特点

  成员变量:既可以是变量,也可以是常量。

  构造方法:有,用于子类访问父类数据的初始化。

  成员方法:既可以是普通方法,也可以是抽象方法。

 

  抽象类的成员方法特性:

    抽象方法:强制要求子类做事情。

    普通方法:让子类去继承,提高代码的复用性。


4.抽象类案例

package com;
/**
 *  具体事务:猫 狗
 *  共性:姓名 年龄 吃饭
 * 
 *  分析:从具体到抽象
 *   猫:
 *   	成员变量:姓名 年龄
 *   	成员方法:吃饭(猫吃鱼)
 *   狗:
 *      成员变量:姓名 年龄
 *   	成员方法:吃饭(狗吃肉)
 *   
 *   因为有共性的内容,所以就提取了父类--动物。
 *   但是由于吃饭的内容不一样,所以吃饭的方法是抽象的。
 *   而方法是抽象的,所以动物类必须为抽象类。
 *   
 *   抽象类:
 *   	成员变量: 姓名  年龄
 *      成员方法: 吃饭()
 *  
 *  实现:从抽象到具体
 *   动物类:
 *   	成员变量: 姓名  年龄
 *      成员方法: 吃饭()
 *   狗类:
 *   	继承自动物的类,重写吃饭()
 *   猫类:
 *   	继承自动物的类,重写吃饭()
 */
//抽象类---动物类
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);
	}
	
	@Override
	public void eat() {
		System.out.println("狗吃肉");
	}
}
//具体类--猫类
class Cat extends Animal{
	//无参构造方法
	public Cat(){}
	//有参构造方法
	public Cat(String name,int age){
		super(name, age);
	}
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
public class AbstractTest {
	public static void main(String[] args) {
		Animal a = new Dog("旺财",2);
		System.out.println("狗的姓名:"+a.getName()+",年龄:"+a.getAge());
		a.eat();
		
		
		a = new Cat("进宝",3);
		a.eat();
		System.out.println("猫的姓名:"+a.getName()+",年龄:"+a.getAge());
		
	}
}
package com;
/**
 *	具体事物:语文老师  数学老师
 *	共性:姓名 年龄 讲课
 *	
 *	分析:
 *		语文老师
 *			姓名  年龄
 *			讲课
 *		数学老师
 *			姓名 年龄
 *			讲课
 *	实现:
 *		老师类
 *			语文老师
 *			数学老师	
 */
//抽象类--老师类
abstract class Teacher{
	private String name;//姓名
	private int age;//年龄
	
	//无参构造方法
	public Teacher(){}
	//有参数构造方法
	public Teacher(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 teach();
	
}
//语文老师类
class ChineseTeacher extends Teacher{
	//无参构造方法
	public ChineseTeacher(){}
	//有参构造方法
	public ChineseTeacher(String name,int age){
		super(name,age);
	}
	@Override
	public void teach() {
		System.out.println("讲语文");
	}
	
}
//数学老师类
class MathTeacher extends Teacher{
	//无参构造方法
	public MathTeacher() {}
	//有参构造方法
	public MathTeacher(String name,int age){
		super(name, age);
	}
	@Override
	public void teach() {
		System.out.println("讲数学");
	}
	
}
//测试类
public class AbstractTest1 {
	public static void main(String[] args) {
		Teacher t = new ChineseTeacher("语文老师哈哈", 40);
		System.out.println("语文老师姓名:"+t.getName()+",年龄:"+t.getAge());
		t.teach();
		
		t = new MathTeacher("数学老师呵呵", 22);
		System.out.println("数学老师姓名:"+t.getName()+",年龄:"+t.getAge());
		t.teach();
	}

}
package com;
/**
 *	 学生案例
 *		具体事物:文科班学员  理科班学员
 *		共性:姓名 年龄 班级 学习 吃饭
 *	分析:
 *		文科班学员
 *			成员变量:姓名 年龄 班级
 *			成员方法:学习 吃饭
 *		理科班学员
 *			成员变量:姓名 年龄 班级
 *			成员方法:学习 吃饭
 *		得到一个学员类:
 *			成员变量:姓名 年龄 班级
 *			成员方法:学习 吃饭
 *	实现:
 *		学员类:
 *			文科班学员
 *			理科班学员
 *	
 */
//定义抽象类 学员类
abstract class Employee{
	private String name;//姓名
	private int age;//年龄
	private String classMate;//班级
	
	//无参构造方法
	public Employee(){}
	//有参构造方法
	public Employee(String name,int age,String classMate){
		this.name = name;
		this.age = age;
		this.classMate = classMate;
	}
	
	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 String getClassMate() {
		return classMate;
	}
	public void setClassMate(String classMate) {
		this.classMate = classMate;
	}
	
	/**
	 * 吃饭
	 */
	public void eat(){
		System.out.println("吃饭");
	}
	/**
	 * 学习
	 */
	public abstract void study();
	
}
//文科学员
class LiberalEmployee extends Employee{
	//无参构造方法
	public LiberalEmployee(){}
	//有参构造方法
	public LiberalEmployee(String name,int age,String classMate){
		super(name, age, classMate);
	}
	
	@Override
	public void study() {
		System.out.println("学习文科");
		
	}
}
//理科学员
class ScienceEmployee extends Employee{
	//无参构造方法
	public ScienceEmployee(){}
	//有参构造方法
	public ScienceEmployee(String name,int age,String classMate){
		super(name, age, classMate);
	}

	@Override
	public void study() {
		System.out.println("学习理科");
	}
	
}
//测试类
public class AbstractTest2 {
	public static void main(String[] args) {
		Employee e = new LiberalEmployee("文科学员哈哈",20,"文科班01班");
		System.out.println("文科班学员姓名:"+e.getName()+",年龄:"+e.getAge()+",班级:"+e.getClassMate());
		e.eat();
		e.study();
		
		e = new ScienceEmployee("理科学员呵呵", 18, "理科班01班");
		System.out.println("理科班学员姓名:"+e.getName()+",年龄:"+e.getAge()+",班级:"+e.getClassMate());
		e.eat();
		e.study();
	}

}
package cn;
/**
 *	假如我们在开发一个系统时需要对员工类进行设计。
 *	员工包含3个属性:姓名、工号以及工资。
 *	经理也是员工,除了含有员工的属性外,还有一个奖金的属性。
 *	请使用继承的思想设计出员工类和经理类。
 *	要求类中提供必要的方法进行属性访问。 
 */
//员工类
abstract class Employee{
	private String name;//姓名
	private String empno;//编号
	private double salary;//薪水
	
	public Employee(){}
	public Employee(String name,String empno,double salary){
		this.empno = empno;
		this.name = name;
		this.salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmpno() {
		return empno;
	}
	public void setEmpno(String empno) {
		this.empno = empno;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	/**
	 * 工作
	 */
	public abstract void work();
}
//程序员
class Programmer extends Employee{
	//无参构造方法
	public Programmer(){}
	//有参构造方法
	public Programmer(String name,String empno,double salary){
		super(name, empno, salary);
	}
	@Override
	public void work() {
		System.out.println("按照需求写代码");
	}
	
}
//经理
class Manager extends Employee{
	private double  bonus;//奖金
	
	//无参构造方法
	public Manager(){}
	//有参构造方法
	public Manager(String name,String empno,double salary,double bonus){
		super(name, empno, salary);
		this.bonus = bonus;
	}
	
	public double getBonus() {
		return bonus;
	}
	public void setBonus(double bonus) {
		this.bonus = bonus;
	}
	@Override
	public void work() {
		System.out.println("和客户谈需求");
	}
	
}
//测试类
public class AbstractTest {
	public static void main(String[] args) {
		Employee e = new Programmer("程序员哈哈", "001", 5000);
		System.out.println("姓名:"+e.getName()+"编号:"+e.getEmpno()+"薪水:"+e.getSalary());
		e.work();
		
		e = new Manager("经理呵呵", "01", 10000, 5000);
		System.out.println("姓名:"+e.getName()+"编号:"+e.getEmpno()+"薪水:"+e.getSalary()+"奖金:"+((Manager)e).getSalary());
		e.work();
		
	}

}


5.抽象类小问题

  一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义。

  可以,不让创建对象。


  abstract关键字和private关键字、final关键字冲突和static关键字无意义。


本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1858993

java之抽象类

标签:java之抽象类

原文地址:http://11841428.blog.51cto.com/11831428/1858993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!