黑马程序员——Java基础--抽象

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

第三讲 抽象

一、 概述

        前面说的了继承和多态,今天我继续来说一下我对抽象的理解,希望能大家一点帮助,顺便我也可以总结中学习。

        抽象,顾名思义,简单的说就是虚的,看不见、摸不着的。就像我们生活中所说到的动物、水果什么的,动物和水果都有很多种,在这里没有说明确到底是哪一种动物和水果,所以可以说是抽象的。而在Java语言中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

我们用abstract关键字来修饰,因此,被其修饰的类和方法叫做抽象类和抽象方法。其格式如下:

  修饰类:
   abstract class 类名{}

  修饰方法:
   public abstract void eat(); // 注意:不能有方法体,需要用;结束

  注意:
     1、类里面有抽象方法,类必须是抽象;
     2、但是,抽象类里面不一定全都是抽象方法;

     3、抽象类不能实例化,就是不能new ,我们只能使用它的子类对象;虽然不能被实例化,但是依然有构造方法,作用是:当子类创建对象的时候,父类可以初始化数据。

     4、子类的要求:要么是抽象的,要么覆盖父类中所有的抽象方法。

二、特点

        其最大的特点就是:抽象类和抽象方法必须用abstract关键字修饰,抽象类不一定有抽象方法,有抽象方法的类一定是抽象类,抽象类不能实例化。当然,其成员特点也有,而成员特点又分为成员变量、构造方法、成员方法,它们的特点如下:

       成员变量:

              可以使变量,也可以常量。

       构造方法:

             有,不能创建对象,只能初始化数据,也就是说不能实例化,用于子类访问父类数据的初始化。

       成员方法:

             可以有抽象方法,限定子类必须完成某些动作,也可以有非抽象方法,提高代码的复用性。

三、应用举例

1、一个简单的概念性的题。

abstract 修饰的不能和哪些关键字共存?

答:

   private:对子类隐藏,而 abstract 必须让子类重写,因此会产生冲突;
   final:final表示最终的意思,不能被重写,产生矛盾冲突;
   static:静态的,类名调用,没有方法体。

2、A:案例
       具体事物:基础班老师,就业班老师
       共性:姓名,年龄,讲课。

<pre class="java" name="code">package abstracttest;
/*
	抽象类练习:
	A:案例
		具体事物:基础班老师,就业班老师
		共性:姓名,年龄,讲课。
		分析:
			1.老师分为:基础班老师,就业班老师
			2.共性有:姓名,年龄,讲课;可列为抽象变量和抽象方法
*/
public class TeacherTest{
	public static void main(String[] args){
		Teacher bt = new BaseTeacher("康老师",28);// 多态
		bt.teach();
		bt.show();
		System.out.println("-----------------------");
		Teacher wt = new WorkTeacher();// 多态
		wt.teach();
	}
}
// 抽象类
abstract class Teacher{
	// 成员变量
	private String name;
	private int age;
	// 构造方法
	Teacher(){}
	Teacher(String name,int age){
		this.name = name;
		this.age = age;
	}
	public abstract void teach();
	public void show(){
		System.out.println(name+"----"+age);
	}
}
class BaseTeacher extends Teacher{
	BaseTeacher(){}
	BaseTeacher(String name,int age){
		super(name,age);
	}
	public void teach(){
		System.out.println("我们的基础班老师是....");
	}
}
class WorkTeacher extends Teacher{
	public void teach(){
		System.out.println("我们的就业班老师....");
	}
}

 

 

结果为:

我们的基础班老师是....康老师----28-----------------------我们的就业班老师....

3、B:案例        具体事物:猫,狗        共性:姓名,年龄,吃饭

package abstracttest;
/*
B:案例
	具体事物:猫,狗
	共性:姓名,年龄,吃饭
*/
public class AnimalTest{
	public static void main(String[] args){
		Animal a = new Cat("Tom",2);
		a.show();
		a.eat();
		System.out.println("----------");
		Animal b = new Dog();
		b.eat();
	}
}
abstract class Animal{
// 成员变量
	private String name;
	private int age;
// 构造方法
Animal(){}
	Animal(String name,int age){
		this.name = name;
		this.age = age;
}
// 成员方法
public abstract void eat();
	public void show(){
		System.out.println(name+"------"+age);
	}
}
class Cat extends Animal{
	Cat(){}
	Cat(String name,int age){
		super(name,age);
	}
public  void eat(){
	System.out.println("吃鱼........");
	}
}
class Dog extends Animal{
	public  void eat(){
		System.out.println("吃骨头..........");
	}
}


 

结果为:

Tom------2
吃鱼........
----------
吃骨头..........

  -----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值