从抽象类到接口—手把手教你写抽象类(一)—还在Ctrl C的伙伴们看过来了

目录

一、抽象类概述

二、抽象类的特点

三、抽象类的案例

四、抽象类的细节

五、抽象类的思想

抽象类概述

  • 抽象定义

        –抽象是从多个事物中将共性的,本质的内容抽取出来。

        –例:狼和狗共性都是犬科,犬科就是抽象出来的概念。

  • 抽象类

        Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的类就是抽象类。

抽象方法的由来:

        多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽取功能主体,那么只有功能声明,没有功能主体的方法称为抽象方法。

        例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不明确吼叫的细节。

如何知道它是一个抽象方法或者抽象类?看其是否有关键字abstrsct修饰。

注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类

看完解释,抽象类代码怎么写呢?代码注释很清晰易懂,应该这样写:

package com.demo01;
/*
 * abstract:关键字,用于修饰方法和类
 * 抽象方法:不同类的方法是相似,但是具体内容又不太一样,所以我们只能抽取他的声明,没有具体的方法体,没有具体方法体的方法就是抽象方法
 * 抽象类:有抽象方法的类必须是抽象类
 * 
 * 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类
 */
public class ExtendsDemo {

}
abstract class Animal {
	// 抽像方法
	public abstract void eat();  // 没有方法体的方法
	
	//非抽象方法子类可以不重写
	public void run() {
		
	}
}

// 猫的子类 必须要实现eat方法
class Cat extends Animal {
	// 证明实现的是父类里边的方法,或者是继承的父类里边的方法
	@Override
	// 这个必须要实现父类里边的抽象方法,否则会报错
	public void eat() {
		System.out.println("猫吃鱼");
	}
}

//狗的抽象子类
abstract class Dog extends Animal {
	// 这个方法可以不是现父类里边的方法,因为它也是一个抽象类
	public void eat() {
		System.out.println("狗吃屎");
	}
}

抽象类的特点

  1. 抽象方法一定在抽象类中,不可能在一个普通类中定义抽象类
  2. 抽象方法和抽象类都必须被abstract关键字修饰
  3. 抽象类不可以用new创建对象,因为调用抽象方法没意义
  4. 抽象类中的抽象方法要被使用,必须由子类覆写其所有的抽象方法后,建立子类对象调用; 如果子类只覆盖了部分的抽象方法,那么该子类还是一个抽象类。
  5. 抽象类中可以有抽象方法也可以有非抽象方法
  6. 抽象类和一般类没有太大的不同:   该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂得东西。这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体,也就是比一般类多了抽象方法而已.
  7. 特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象

我们用代码对上诉理解进行解释,代码如下:

package com.demo01;

/*
 * 抽象类的特点:
 * 		抽象方法只能在抽象类里面
 * 		抽象类和抽象方法必须被abstract修饰
 * 		抽象类不能创建对象(不能实例化)
 * 		抽象类中可以有非抽象的方法
 * 		抽象类和类的关系也是继承
 * 		一个类继承了抽象类要么重写所有的抽象方法,要么他自己是抽象类
 */
public class ExtendsDemo {
	public static void main(String[] args) {
		//Animal a = new Animal();
		Cat cat = new Cat();
		cat.eat();
		cat.sleep();
		cat.run();
	}
}

// 抽象类
abstract class Animal {
	// 非抽象方法
	public void eat() {
		
	}
	// 非抽象方法
	public void sleep() {
		
	}
	
	// 抽象方法
	public abstract void run() ;
}

// 非抽象类
class Cat extends Animal {


	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		
	}
	
	public void run(){
	}

}

抽象类成员特点

  • 成员变量 

        –可以有变量

        –可以有常量

  • 构造方法

        –可以有构造方法

  • 成员方法 

        –可以有抽象方法

        –可以有非抽象方法

注:既然你是一个构造方法,我们在调用类的时候,首先调用的是一个构造方法,普通的构造方法是和对象一起存在的,如果你是一个抽象的构造方法,根本就么有意义,构造方法不可以是一个抽象的方法的。

代码理解如下:

package com.demo01;

import com.demo01.Animal;
import com.demo01.Dog;

/*
 * 抽象类的成员特点:
 * 		成员变量
 * 			可以有成员变量
 * 			可以有常量
 * 		成员方法
 * 			可以有抽象方法
 * 			可以有非抽象方法
 * 		构造方法
 * 			可以有构造方法的,需要对抽象类的成员变量进行初始化
 * 
 * final:修饰类、成员变量、成员方法
 */
public class ExtendsDemo {
	public static void main(String[] args) {
		Dog d = new Dog();
		d.barking();
		d.eat();
	}
}

// 抽象类
abstract class Animal {
	String name = "哮天犬";
	// 常量修饰符,不可以被修改,不可以赋新的值
	final int NUM = 10;
	
	public Animal() {
		System.out.println("我是抽象类的构造方法");
	}
	
	public Animal(int n) {
		System.out.println("我是抽象类的构造方法");
	}
	
	public abstract void eat();
	
	public void run() {
		
	}
}

// 子类继承父类
class Dog extends Animal {

	public void barking() {
		
		System.out.println(name);
		System.out.println(NUM);
	}

	
	public void eat() {
		System.out.println("吃");
		
	}
}


抽象类的案例

老师示例,根据给出内容设计继承体系

        –具体事物:基础班老师,就业班老师

        –共性:姓名,所属教室,讲课。

学员示例(练习)——类似,自己练习哈

        –具体事物:基础班学员,就业班学员

        –共性:姓名,学习

代码如下:

package com.demo01;

import com.demo01.BasicTeacher;
import com.demo01.JobTeacher;
import com.demo01.Teacher;

/*
 *	基础班老师,就业班老师
 *
 *	共性:
 *		属性	姓名,年龄,性别
 *		行为	讲课,唱歌
 */
public class ExtendsDemo {
	public static void main(String[] args) {
		BasicTeacher bt = new BasicTeacher();
		bt.name = "张老师";
		bt.teach();
		
		JobTeacher jt = new JobTeacher();
		jt.name = "王老师";
		jt.teach();
	}
}

//定义一个抽象类(父类)
abstract class Teacher {
	
	String name;//姓名
	int age;//年龄
	String gender;//性别
	
	//讲课
	public abstract void teach();
}

// 定义一个子类
class BasicTeacher extends Teacher {

	@Override
	public void teach() {
		System.out.println(name + "讲基础班课程");
		
	}
	
}

class JobTeacher extends Teacher {

	@Override
	public void teach() {
		System.out.println(name + "讲就业班课程");
	}
	
}

抽象类的细节

  • 抽象关键字abstract不可以和哪些关键字共存?

        答:不可以和final、paivate共用,(1)加上final关键字意思是不能被继承,而abstract不能创建对象,只能被继承,然后创建对象来访问抽象类中的成员变量和成员方法,所以abstract不能和final共用。(2)abstract必须要被别人继承使用,pravite是私有的,其他得类,谁都看不到。

  • 抽象类中是否有构造函数

        答:有呢,因为抽象类中也可以定义一些变量,常量,也是希望被别的类访问,也有初始化过程,可以不写构造函数,但是有一个默认的,隐含的构造函数。

  • 抽象类中可不可以没有抽象方法

        答:一般是有的,但是也可以没有,但是其他的类,可以继承我的类,但是不可以new我的类。

抽象类思想

(1)在抽象类中,我定义一个抽象方法,我只不过是定义一个规范,在其他类继承我的抽象类时,必须按我的规范执行。

(2)Writer和Reader是我们Java中的一个抽象类。

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限嚣张(菜菜)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值