面向对象【抽象类、接口】

面向对象【抽象类、接口】

思维导图如下:
在这里插入图片描述

1、抽象类

1.1、概念

分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。也就是说我们把方法声明抽取,让子类继承后,自己去实现方法体,没有方法体的方法,需要用抽象的关键字abstract标志一下。

1.2、特点

  1. 抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
  2. 抽象类不可以创建实例(不能被实例化),原因:调用抽象方法没有意义
  3. 只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。否则该子类还是一个抽象类。换句话说抽象类不一定有抽象方法,但抽象方法所在的类一定是抽象类

1.3、抽象类中数据的特点

  1. 抽象类中可以有变量,也可以有常量。
  2. 抽象类中可以有抽象方法,也可以有非抽象方法。
  3. 抽象类是一个类,所以它有构造方法。

1.4、抽象类和一般类的异同点:

相同

  1. 它们都是用来描述事物的。
  2. 它们之中都可以定义属性和行为。

不同

  1. 一般类可以具体的描述事物。抽象类描述事物的信息不具体
  2. 抽象类中可以多定义一个成员:抽象函数。
  3. 一般类可以创建对象,而抽象类一定不能创建对象。

1.5、抽象类中的细节问题

1.5.1、抽象类中是否有构造方法?能不能被实例化?如果不能,构造方法有什么意义?
  • 抽象类有构造方法,不能被实例化,抽象类的构造方法供子类实例化调用。
1.5.2、抽象关键字abstract不可以和那些关键字共存?
  • private :是有内容子类继承不到,所以不能重写,但是abstract修饰的方法是要求被重写的;
  • final:final修饰的方法不能被重写;
  • static:如果一个抽象方法通过static修饰,这个方法可以直接通过类名调用,但是抽象方法是没有方法体的,这样的调用没有意义。
1.5.3、抽象类可不可以没有抽象方法?如果可以,这样的类有什么用吗?
  • 抽象类可以没有抽象方法。
  • 没有的抽象方法的抽象类的作用是为了不让别的类建立该抽象类对象。
abstract class Employee
{
	private String name;
	private String id;
	private double pay;
	//构造一个员工对象,一初始化就具备着三个属性。
	public Employee(String name,String id,double pay)
	{
		this.name = name;
		this.id = id;
		this.pay = pay;
	}
	//工作行为,由于工作内容不具体,用抽象类描述
	public abstract void work();
}
//具体的子类:程序员。
class Programmer extends Employee
{
	public Programmer(String name,String id,double pay)
	{
		super(name,id,pay);
	}
	public void work()
	{
		System.out.println("code....");
	}
}
//具体的子类:经理。
class Manager extends Employee
{
	//特有属性。
	private double bonus;
	public Manager(String name,String id,double pay,double bonus)
	{
		super(name,id,pay);
		this.bonus = bonus;
	}
	public void work()
	{
		System.out.println("manage");
	}
}

2、接口

2.1、概念

当一个类中的方法都是抽象的时候,java提供了接口。

定义普通的类或者抽象类可以使用class关键字,定义接口必须用interface关键字修饰,类与接口关系用implements表示。

2.2、成员特点

  • 成员变量:是常量,固定默认修饰 public static final
  • 成员方法:都是抽象的,固定默认修饰public abstract
  • 接口中的成员都是公共的。
  • 接口不可以创建对象。
  • 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。

2.3、接口与类之间的关系

2.3.1、类与类的关系:

都是抽象的,默认修饰public abstract。

interface Demo//定义一个名称为Demo的接口。
{
	public static final int NUM = 3;
	public abstract void show1();
	public abstract void show2();
}
//定义子类去覆盖接口中的方法。子类必须和接口产生关系,类与类的关系是继承,类与接口之间的关系是 实现。通过 关键字 implements
class DemoImpl implements Demo//子类实现Demo接口。
{
	//重写接口中的方法。
	public void show1(){}
	public void show2(){}
}
2.3.2、类与接口的关系:

是实现关系。类可以多实现接口,使用关键字implements;

interface A
{
	void abstract show1();
}
interface B
{
	void abstract show2();
}
class C implements A,B// 多实现。同时实现多个接口。
{
	public void show1(){}
	public void show2(){}
}

类在继承一个类的同时,可以实现多个接口。

class Fu
{
	public void show(){}
}
interface Inter
{
	public abstract void show1();
}
class Zi extends Fu implements Inter
{
	public void show1()
	{}
}
2.3.3、接口与接口的关系:

是继承关系,接口可以多继承接口

interface A{
	 abstract void show();
}
interface B{
	abstract void show1();
}
interface C{
	abstract void show2();
}
interface D extends A,B,C{
	 abstract void show3();
}

2.4、接口的特点

  • 是对外暴露的规则;
  • 是功能的扩展;
  • 接口的出现降低了耦合性;
  • 接口可以多实现。如:CPU和主板、笔记本的USB接口、插座等。

2.5、与抽象类的区别

抽象类接口
抽象类只能被单继承接口可以多实现,接口的出现避免了多继承的局限性
抽象类中定义的是继承体系中的共性功能接口中定义的是继承体系中的扩展功能
抽象类被继承是“is a ”的关系:xx是yy的一种接口被实现是“ like a ”的关系:xx像yy的一种
抽象类中的成员变量可以是变量也可以是常量接口中的成员变量是常量。默认修饰public static final
抽象类的成员方法可以是抽象方法也可以是非抽象方法接口的成员方法都是抽象方法。都有默认修饰public abstract
抽象类有构造方法接口没有构造方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们要设计一个动物园的程序,其中有多种动物,每种动物都有自己的特性和行为。这时候,我们可以使用面向对象的设计思想来实现这个程序。 首先,我们可以定义一个抽象类 Animal,它包含动物的基本属性和行为,例如: ```java public abstract class Animal { protected String name; protected int age; public Animal(String name, int age) { this.name = name; this.age = age; } public abstract void eat(); public abstract void sleep(); public abstract void makeSound(); } ``` 在这个抽象类中,我们定义了动物的基本属性 name 和 age,以及三个抽象方法 eat、sleep 和 makeSound,表示动物的基本行为。由于每种动物的具体实现不同,因此这些方法只是声明而不实现,留给子类去具体实现。 接下来,我们可以定义几个具体的动物子类,例如: ```java public class Lion extends Animal { public Lion(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("Lion is eating meat."); } @Override public void sleep() { System.out.println("Lion is sleeping."); } @Override public void makeSound() { System.out.println("Roar!"); } } public class Elephant extends Animal { public Elephant(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("Elephant is eating grass."); } @Override public void sleep() { System.out.println("Elephant is sleeping."); } @Override public void makeSound() { System.out.println("Trumpet!"); } } ``` 在这些子类中,我们重写了父类中的抽象方法,并实现了具体的行为。例如,Lion 类中的 eat 方法表示狮子吃肉,而 Elephant 类中的 eat 方法表示大象吃草。 最后,我们可以在主程序中创建一个动物园对象,添加各种不同的动物,例如: ```java public class Zoo { private List<Animal> animals; public Zoo() { animals = new ArrayList<>(); } public void addAnimal(Animal animal) { animals.add(animal); } public void showAnimals() { for (Animal animal : animals) { System.out.println(animal.name + " is " + animal.age + " years old."); animal.eat(); animal.sleep(); animal.makeSound(); System.out.println(); } } } public class Main { public static void main(String[] args) { Zoo zoo = new Zoo(); zoo.addAnimal(new Lion("Simba", 3)); zoo.addAnimal(new Elephant("Dumbo", 5)); zoo.showAnimals(); } } ``` 在主程序中,我们创建了一个动物园对象 zoo,添加了一只狮子和一头大象,然后展示了它们的基本信息和行为。运行程序,可以看到如下输出: ``` Simba is 3 years old. Lion is eating meat. Lion is sleeping. Roar! Dumbo is 5 years old. Elephant is eating grass. Elephant is sleeping. Trumpet! ``` 通过这个例子,我们可以看到抽象类接口的使用。Animal 类作为抽象类定义了动物的基本属性和行为,并声明了一些抽象方法,留给子类去实现。而 Lion 和 Elephant 类作为具体的子类,继承了 Animal 类,并实现了它的抽象方法,以便具体实现狮子和大象的行为。最后,在 Zoo 类中,我们使用 Animal 类的对象来表示动物,从而可以添加不同种类的动物并展示它们的基本信息和行为。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值