抽象类,其实就是在类的前面加上一个abstract,一定注意是在类的前面,如果将abstract关键字声明在类的后面就会报错。抽象类主要在模板类中使用,之前C++的时候也学过模板类,但已经 忘得差不多了,主要的功能是在父类中先声明一下abstract方法,再子类中再进行重写,如果abstract类的不重写会报错。声明抽象方法的类也必须是抽象类,所以在类的前面也要加abstract关键字,这就体现出了模板的样子。
笔记:
package oop.abstract_test;
public class AbstractTest {
public static void main(String[] args) {
//Cannot instantiate the type Person 一旦Person类被抽象了,便不可以实例化
// Person p1=new Person();
// p1.eat();
}
}
abstract class Person{
String name;
int age;
public Person()
{
}
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
//不是抽象方法
// public void eat()
// {
//
// }
abstract public void eat();
public abstract void walk()
{
System.out.println("人走路");
}
}
class Student extends Person{
public void eat() {
System.out.println("学生要吃有营养的食物");
}
@Override
public void walk() {
// TODO Auto-generated method stub
}
}
例子;
package oop.abstract_test;
public abstract class Employee {
private String name;
private int id;
private double salary;
public Employee() {
}
public Employee(String name,int id,double salary)
{
this.name=name;
this.id=id;
this.salary=salary;
}
public abstract void work();
}
package oop.abstract_test;
public class Manager extends Employee{
private double bonus;//奖金
public Manager(double bonus) {
super();
this.bonus = bonus;
}
public Manager(String name, int id, double salary, double bonus) {
super(name, id, salary);
this.bonus = bonus;
}
@Override
public void work() {
// TODO Auto-generated method stub
System.out.println("管理员工,提供运行效率");
}
}
package oop.abstract_test;
public class EmployeeTest {
public static void main(String[] args) {
//多态
Employee manager=new Manager("Tom", 1001, 1000, 1000);
manager.work();
CommonEmployee commonEmployee = new CommonEmployee();
commonEmployee.work();
}
}
抽象类的应用:匿名子类(个人感觉不太重要)
package oop.abstract_test;
public class PersonTest {
public static void main(String[] args) {
method(new Student());//匿名对象
worker worker1=new worker();
method1(worker1);//非匿名的类,非匿名的对象
method1(new worker());//非匿名的类 ,匿名对象
//创建了一个匿名子类的对象p
Person p=new Person() {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("好好吃饭");
}
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("好好走路");
}
};
method1(p);
System.out.println("***************");
//创建匿名子类的匿名对象
method1(new Person() {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃好吃的东西");
}
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("好好看路,走路");
}
});
}
public static void method1(Person p)
{
p.walk();
p.eat();
}
public static void method(Student s)
{
}
}
class worker extends Person{
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void walk() {
// TODO Auto-generated method stub
}
}
抽象类的应用:模板方法设计模式(这个感觉还是有用处的)
package oop.abstract_test;
public abstract class TemplateTest {
public static void main(String[] args) {
Template t=new SubTemplate();
t.spendTime();
}
}
//计算某段代码执行所需要花费时间
abstract class Template{
public void spendTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println("花费的时间为:"+(end-start));
}
public abstract void code();
}
class SubTemplate extends Template{
public void code(){
for(int i=2;i<1000;i++)
{ boolean isFlag=true;
for(int j=2;j<=Math.sqrt(j);j++)
{
if(i%j==0)
{
isFlag=false;
break;
}
}
if(isFlag)
{
System.out.println(i);
}
}
}
}



