抽象类

抽象类

怎样理解抽象类:
打个形象的比喻:
我们以前定义一个动物类,动物有吃的行为,但是我们没有指定这是哪个动物(不是一个具体的事物),而且动物吃的行为也不知道是哪种具体吃的行为。所以这里我们所指的动物类就可以看做是一个抽象类。这个动物拥有动物的属性和方法。

特点:
1-抽象类和抽象方法必须用abstract关键字修饰。
2-抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
3-抽象类不能直接实例化(可通过多态实现),因为它不是具体的类。(但是有构造方法)
4-抽象类是有构造方法的,只是不能实例化,用于子类访问父类数据的初始化。
抽象类的子类:
      1- 不重写抽象方法,抽象类的子类是一个抽象子类
      2-重写父类所有父类方法,子类不是抽象类(可通过该子类可实例化抽象父类)

例如:动物类
abstract class Animal{
   public abstract void eat();
}
注意:抽象类中可以没有抽象方法。
      抽象方法不能有方法体。
注意:空方法体和没有方法体的区别。

抽象类的成员特点:
  成员变量:
       既可以是变量也可以是常量。
  构造方法:
       有构造方法,用于子类访问父类数据的初始化。
  成员方法:
       抽象类中方法既可以是抽象的,也可以是非抽象方法。
在父类中:
      非抽象方法:子类继承的事情,提高代码的复用性
      抽象方法:强制要求子类做的事情。

抽象类中注意的问题:
一个类如果没有抽象方法,可以是抽象类,即抽象类中可以完全没有抽象方法。
这样类的主要目的就是不让创建该类对象。

abstract关键字不可以个那些关键字使用。
private 冲突;private修饰的成员不能被继承,从而不可以被子类重写,而abstract修饰的是要求被重写的。
final  冲突;final修饰的成员是最终成员,不能被重写,所以冲突,
static 无意义;static修饰成员用类名可以直接访问,但是abstract修饰成员没有方法体,所以访问没有方法体的成员无意义。

案例:定义一个动物类:

  1. package day09;  
  2.   
  3. public abstract class AnimalDe1 {  
  4.     private String name;  
  5.     private int age;  
  6.       
  7.     public AnimalDe1(){};  
  8.     public AnimalDe1(String name,int age){  
  9.         this.name=name;  
  10.         this.age=age;  
  11.     }  
  12.       
  13.     public String getName(){  
  14.         return name;  
  15.     }  
  16.     public void setName(String name){  
  17.         this.name=name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.     public abstract void eat();  
  26.       
  27. }  
package day09;

public abstract class AnimalDe1 {
	private String name;
	private int age;
	
	public AnimalDe1(){};
	public AnimalDe1(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();
	
}
定义一个狗类:

  1. package day09;  
  2.   
  3. public class DogDe1 extends AnimalDe1 {  
  4.       
  5.     public DogDe1(){}  
  6.     public DogDe1(String name,int age){  
  7.         super(name,age);  
  8.     }  
  9.     public void eat() {  
  10.         System.out.println("狗吃肉!!!");  
  11.     }  
  12.   
  13. }  
package day09;

public class DogDe1 extends AnimalDe1 {
    
	public DogDe1(){}
	public DogDe1(String name,int age){
		super(name,age);
	}
	public void eat() {
		System.out.println("狗吃肉!!!");
	}

}
定义一个猫类:

  1. package day09;  
  2.   
  3. public class CatDe1 extends AnimalDe1 {  
  4.     public CatDe1(){}  
  5.     public CatDe1(String name,int age){  
  6.         super(name,age);  
  7.     }  
  8.     public void eat() {  
  9.         System.out.println("猫吃鱼!!!");  
  10.     }  
  11.   
  12. }  
package day09;

public class CatDe1 extends AnimalDe1 {
	public CatDe1(){}
	public CatDe1(String name,int age){
		super(name,age);
	}
	public void eat() {
		System.out.println("猫吃鱼!!!");
	}

}

测试类:

  1. package day09;  
  2.   
  3. public class MainDe1 {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         DogDe1 dd = new DogDe1();//调用无参构造实现  
  10.         dd.setName("狗狗1");  
  11.         dd.setAge(2);  
  12.         System.out.println(dd.getName()+"年龄:"+dd.getAge());  
  13.         dd.eat();  
  14.         System.out.println("------------------");  
  15.         DogDe1 dd1 = new DogDe1("狗狗2",3);//通过调用有参构造方法实现  
  16.         System.out.println(dd1.getName()+"年龄:"+dd1.getAge());  
  17.         dd1.eat();  
  18.         System.out.println("------------------");  
  19.         AnimalDe1 dd2 = new DogDe1();//多态实现  
  20.         dd2.setName("狗狗3");  
  21.         dd2.setAge(4);  
  22.         System.out.println(dd2.getName()+"年龄:"+dd2.getAge());  
  23.         dd2.eat();  
  24.           
  25.     }  
  26.     //猫类同理!!  
  27.   
  28. }  
package day09;

public class MainDe1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DogDe1 dd = new DogDe1();//调用无参构造实现
		dd.setName("狗狗1");
		dd.setAge(2);
		System.out.println(dd.getName()+"年龄:"+dd.getAge());
		dd.eat();
		System.out.println("------------------");
		DogDe1 dd1 = new DogDe1("狗狗2",3);//通过调用有参构造方法实现
		System.out.println(dd1.getName()+"年龄:"+dd1.getAge());
		dd1.eat();
		System.out.println("------------------");
		AnimalDe1 dd2 = new DogDe1();//多态实现
		dd2.setName("狗狗3");
		dd2.setAge(4);
		System.out.println(dd2.getName()+"年龄:"+dd2.getAge());
		dd2.eat();
		
	}
	//猫类同理!!

}
输出:

狗狗1年龄:2
狗吃肉!!!
------------------
狗狗2年龄:3
狗吃肉!!!
------------------
狗狗3年龄:4
狗吃肉!!!

案例e2:

定义一个老师类:

  1. package day09;  
  2.   
  3. public abstract class Teacher {  
  4.     private String name;  
  5.     private int age;  
  6.       
  7.     public Teacher(){}  
  8.     public Teacher(String name, int age){  
  9.         this.name=name;  
  10.         this.age=age;  
  11.     }  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     public abstract void teach();  
  25. }  
package day09;

public 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();
}
定义一个基础老师类:

  1. package day09;  
  2.   
  3. public class BasicTeacher extends Teacher {  
  4.     public BasicTeacher(){}  
  5.     public BasicTeacher(String name,int age){  
  6.         super(name,age);  
  7.     }  
  8.     public void teach() {  
  9.        System.out.println("基础班"+super.getName()+"老师交基础课程!!");     
  10.     }  
  11.       
  12.   
  13. }  
package day09;

public class BasicTeacher extends Teacher {
	public BasicTeacher(){}
	public BasicTeacher(String name,int age){
		super(name,age);
	}
	public void teach() {
	   System.out.println("基础班"+super.getName()+"老师交基础课程!!");	
	}
	

}
定义一个高级老师类:
  1. package day09;  
  2.   
  3. public class BasicTeacher extends Teacher {  
  4.     public BasicTeacher(){}  
  5.     public BasicTeacher(String name,int age){  
  6.         super(name,age);  
  7.     }  
  8.     public void teach() {  
  9.        System.out.println("基础班"+super.getName()+"老师交基础课程!!");     
  10.     }  
  11.       
  12.   
  13. }  
package day09;

public class BasicTeacher extends Teacher {
	public BasicTeacher(){}
	public BasicTeacher(String name,int age){
		super(name,age);
	}
	public void teach() {
	   System.out.println("基础班"+super.getName()+"老师交基础课程!!");	
	}
	

}
测试类:

  1. package day09;  
  2.   
  3. public class MainTeacher {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         Teacher bt = new BasicTeacher();//实现多态  
  10.         bt.setName("李春男");  
  11.         bt.setAge(24);  
  12.         System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());  
  13.         bt.teach();  
  14.         System.out.println("--------------");//  
  15.         bt = new BasicTeacher("杨莉",24);//有参构造方法实现  
  16.         System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());  
  17.         bt.teach();  
  18.         System.out.println("--------------");//  
  19.         bt = new HighTeacher();//多态拓展,高级老师  
  20.         bt.setName("李春男");  
  21.         bt.setAge(24);  
  22.         bt.teach();  
  23.         System.out.println("--------------");//  
  24.         bt = new HighTeacher("杨莉",24);//有参构造方法实现  
  25.         System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());  
  26.         bt.teach();  
  27.     }  
  28.   
  29. }  
package day09;

public class MainTeacher {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Teacher bt = new BasicTeacher();//实现多态
		bt.setName("李春男");
		bt.setAge(24);
		System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
		bt.teach();
		System.out.println("--------------");//
		bt = new BasicTeacher("杨莉",24);//有参构造方法实现
		System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
		bt.teach();
		System.out.println("--------------");//
		bt = new HighTeacher();//多态拓展,高级老师
		bt.setName("李春男");
		bt.setAge(24);
		bt.teach();
		System.out.println("--------------");//
		bt = new HighTeacher("杨莉",24);//有参构造方法实现
		System.out.println("姓名:"+bt.getName()+",年龄:"+bt.getAge());
		bt.teach();
	}

}

输出:
姓名:李春男,年龄:24
基础班李春男老师交基础课程!!
--------------
姓名:杨莉,年龄:24
基础班杨莉老师交基础课程!!
--------------
高级班老师李春男交基础课程!!
--------------
姓名:杨莉,年龄:24
高级班老师杨莉交基础课程!!


案例三:员工类:

  1. package day09;  
  2.   
  3. public abstract class Employee {  
  4.     private String name;  
  5.     private int id;  
  6.     private int salary;  
  7.       
  8.     public Employee(){}  
  9.     public Employee(String name,int id,int salary){  
  10.         this.name=name;  
  11.         this.id=id;  
  12.         this.salary = salary;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     public int getId() {  
  21.         return id;  
  22.     }  
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.     public int getSalary() {  
  27.         return salary;  
  28.     }  
  29.     public void setSalary(int salary) {  
  30.         this.salary = salary;  
  31.     }  
  32.     public abstract void work();  
  33.   
  34. }  
package day09;

public abstract class Employee {
	private String name;
    private int id;
    private int salary;
    
    public Employee(){}
    public Employee(String name,int 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 int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
    public abstract void work();

}
程序员类:
  1. package day09;  
  2.   
  3. public class Programer extends Employee {  
  4.   
  5.     public Programer(){}  
  6.     public Programer(String name,int id,int salary){  
  7.         super(name,id,salary);  
  8.     }  
  9.     public void work() {  
  10.         System.out.println("根据需求写代码!");  
  11.   
  12.     }  
  13.   
  14. }  
package day09;

public class Programer extends Employee {

	public Programer(){}
	public Programer(String name,int id,int salary){
		super(name,id,salary);
	}
	public void work() {
		System.out.println("根据需求写代码!");

	}

}
经理类:
  1. package day09;  
  2.   
  3. public class Manager extends Employee {  
  4.     private int bounds;//奖金  
  5.       
  6.     public Manager(){}//无参构造  
  7.     public Manager(String name,int id,int salary,int bounds){//有参构造  
  8.         super(name,id,salary);//传参  
  9.         this.bounds=bounds;//传参  
  10.     }  
  11.     public void work() {  
  12.         System.out.println("和客户谈需求!!!");  
  13.     }  
  14.     public int getBounds() {  
  15.         return bounds;  
  16.     }  
  17.     public void setBounds(int bounds) {  
  18.         this.bounds = bounds;  
  19.     }  
  20.       
  21. }  
package day09;

public class Manager extends Employee {
    private int bounds;//奖金
    
    public Manager(){}//无参构造
    public Manager(String name,int id,int salary,int bounds){//有参构造
    	super(name,id,salary);//传参
    	this.bounds=bounds;//传参
    }
	public void work() {
		System.out.println("和客户谈需求!!!");
	}
	public int getBounds() {
		return bounds;
	}
	public void setBounds(int bounds) {
		this.bounds = bounds;
	}
    
}
测试类:
  1. package day09;  
  2.   
  3.   
  4. public class EmployeeMain {  
  5.   
  6.   
  7.     /** 
  8.      * @param args 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         //多态实现  
  12.         Employee emp = new Programer();  
  13.         emp.setName("李春男");  
  14.         emp.setId(10001);  
  15.         emp.setSalary(8000);  
  16.         System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());  
  17.         emp.work();  
  18.         System.out.println("********************************");  
  19.         Employee emp1 = new Programer("李春男",10001,8000);  
  20.         emp.setSalary(8000);  
  21.         System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());  
  22.         emp.work();  
  23.           
  24.         //经理类  
  25.        /* emp = new Manager(); 
  26.         emp.setName("杨莉"); 
  27.         emp.setId(2001); 
  28.         emp.setSalary(6000); 
  29.         //emp.setBounds(1100);//编译看左边,emp是父类对象引用,而bounds是子类中特有的成变量,所以不能访问,报 
  30.  
  31.  
  32. 错!! 
  33.        */     
  34.         //当遇到有子类特殊变量或者方法时,以上方式不可取,而是直接用具体的类创建对象  
  35.           
  36.         Manager man = new Manager();  
  37.         man.setName("杨莉");  
  38.         man.setId(2001);  
  39.         man.setSalary(5000);  
  40.         man.setBounds(1200);  
  41.         System.out.println("姓名:"+man.getName()+"编号:"+man.getId()+"薪金"+man.getSalary());  
  42.         man.work();  
  43.         System.out.println("*********************************");  
  44.         Manager man1 = new Manager("杨莉",2001,5000,1200);  
  45.         System.out.println("姓名:"+man1.getName()+"编号:"+man1.getId()+"薪金"+man1.getSalary());  
  46.         man1.work();  
  47.     }  
  48.   
  49.   
  50. }  
package day09;


public class EmployeeMain {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//多态实现
		Employee emp = new Programer();
        emp.setName("李春男");
        emp.setId(10001);
        emp.setSalary(8000);
        System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());
        emp.work();
        System.out.println("********************************");
        Employee emp1 = new Programer("李春男",10001,8000);
        emp.setSalary(8000);
        System.out.println("姓名:"+emp.getName()+"编号:"+emp.getId()+"薪金"+emp.getSalary());
        emp.work();
        
        //经理类
       /* emp = new Manager();
        emp.setName("杨莉");
        emp.setId(2001);
        emp.setSalary(6000);
        //emp.setBounds(1100);//编译看左边,emp是父类对象引用,而bounds是子类中特有的成变量,所以不能访问,报


错!!
       */	
        //当遇到有子类特殊变量或者方法时,以上方式不可取,而是直接用具体的类创建对象
        
        Manager man = new Manager();
        man.setName("杨莉");
        man.setId(2001);
        man.setSalary(5000);
        man.setBounds(1200);
        System.out.println("姓名:"+man.getName()+"编号:"+man.getId()+"薪金"+man.getSalary());
        man.work();
        System.out.println("*********************************");
        Manager man1 = new Manager("杨莉",2001,5000,1200);
        System.out.println("姓名:"+man1.getName()+"编号:"+man1.getId()+"薪金"+man1.getSalary());
        man1.work();
	}


}
输出:

姓名:李春男编号:10001薪金8000
根据需求写代码!
********************************
姓名:李春男编号:10001薪金8000
根据需求写代码!
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!
*********************************
姓名:杨莉编号:2001薪金5000
和客户谈需求!!!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值