`
jsbylibo
  • 浏览: 11186 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

抽象类与抽象方法

 
阅读更多

1.随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类

2.用abstract关键字来修饰一个类时,这个类叫做抽象类

3.用abstract来修饰一个方法时,该方法叫做抽象方法

   抽象方法:只有方法的声明,没有方法的实现。以分号结束:abstract int abstractMethod( int a );

4.含有抽象方法的类必须被声明为抽象类。

5.抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍为抽象类。

6.不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法。

实例一:

package com.atguigu.java;

/*
 * abstract:抽象的,可以用来修饰类、方法
 * 
 * 1.abstract修饰类:抽象类
 *  >不可被实例化
 *  >抽象类有构造器(凡是类都有构造器)
 *  >抽象方法所在的类,一定是抽象类。
 *  >抽象类中可以没有抽象方法。
 *  >当我们设计一个类,不需要创建此类的实例的时候,就可以考虑将其设置为抽象的,由其子类实现这个类的抽象方法。
 *  
 * 2.abstract修饰方法:抽象方法
 *  >格式:没有方法体,包括{}.如:public abstract void eat();
 *  >抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此方法。
 *  >若子类继承抽象类,并重写了所有的抽象方法,则此类是一个“实体类”,即可以实例化。
 *  >若子类继承抽象类,没有重写所有的抽象方法,意味着此类仍有抽象方法,则此类必须声明为抽象类。
 *  
 */
public class TestAbstract {
	// Person p1 = new Person();
	// p1.eat();
}

abstract class Creator {
	abstract void breath();
}

abstract class Person extends Creator {
	String name;

	public abstract void eat();

	public abstract void walk();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// public void eat() {
	// System.out.println("吃饭");
	// }
	//
	// public void walk() {
	// System.out.println("走路");
	// }

	public Person() {

	}

	public Person(String name) {
		this.name = name;
	}
}

class Student extends Person {
	public void eat() {
		System.out.println("学生吃饭");
	}

	public void walk() {
		System.out.println("学生走路");
	}

	@Override
	void breath() {
		// TODO Auto-generated method stub

	}

}

abstract class Worker extends Person {
	public void eat() {
		System.out.println("工人吃饭");
	}

	public void walk() {
		System.out.println("工人走路");
	}
}

 实例二:

package com.atguigu.java;

/*
 * abstract 不能用来修饰属性、私有方法(private)、构造器、静态方法、final的方法
 */
public class TestAbstract1 {

}

class A1 {
	// private abstract int i;
	// 构造器不能被重写
	// public abstract A1();
	// 子类不能重写声明为private的方法
	// private abstract void method1();
	// public abstract final void method2();
	// public abstract static void method3();
}

 练习:

package com.atguigu.test;

/*
 * 编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary。
 * 提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。
 * 请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问。
 */
class CommonEmployee extends Employee {

	@Override
	public void work() {
		System.out.println("我是普通员工我要努力工作");
	}

}

class Manager extends Employee {
	private double bonus;

	public double getBonus() {
		return bonus;
	}

	public void setBonus(double bonus) {
		this.bonus = bonus;
	}

	@Override
	public void work() {
		System.out.println("监督员工工作");
	}

}

abstract class Employee {
	private String name;
	private int id;
	private double salary;

	public abstract void work();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

}

public class TestEmployee {
	public static void main(String[] args) {
		// Manager m = new Manager();
		Employee e1 = new Manager();
		e1.work();
		Employee e2 = new CommonEmployee();
		e2.work();
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics