java学习——抽象类与接口

#抽象类

  • 在面向对象的概念中,所有的对象都是通过类来描绘的,
    但是反过来,并不是所有的类都是用来描绘对象的,
    如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

##抽象类的声明格式:

  • public abstract class 类名{}
public abstract class Animal {    	//这是一个抽象类
		public Animal(){}			//这是抽象类的构造方法,用于创建子类对象时对父类数据的初始化
		public final int x;			//这是一个常量
		public int x;				//这是一个变量
		public void show(){}		//这是一个非抽象方法
		public abstract show2();	//这是一个抽象方法
	}

##特点

  • 抽象类和抽象方法必须用abstract修饰

  • 抽象类不一定有抽象方法,但有抽象方法的类一定要定义为抽象类

  • 抽象类不能被实例化,但是可以通过具体的子类实现,是多态的方式
    但是抽象类有构造方法,抽象类的构造方法用于创建子类对象时对父类数据的初始化

  • 抽象类的子类:

    • 抽象类
    • 具体类,重写所有的抽象方法
      ##抽象方法
      没有方法体的方法,即不带花括号。
      用abstract修饰
      定义为:修饰符 abstract 返回值类型 方法名 ();
      ##成员特点
  • 成员变量:
    既可以是常量,也可以是变量,当然也可以没有

  • 构造方法:
    有,用于创建子类对象时对父类数据的初始化

  • 成员方法:
    既可以是抽象的,也可以不是抽象的
    ##成员方法特性
    抽象方法: 强制要求子类做的事情,因为子类必须重写父类的所有抽象方法
    非抽象的方法: 子类继承的事情,提高代码复用性
    ##抽象类不能和哪些关键字共存

  • private 冲突

    原因:被private修饰的方法不能重写

  • final 冲突
    >原因:被final修饰的方法不能被重写

  • static 无意义
    >原因:被static修饰的方法却可以直接被类名调用,但抽象方法没有方法体,所以无意义

#接口
##定义

  • 接口的主体包含着抽象方法,但所有方法在接口内(定义上)都是抽象(Abstract)方法,所以abstract的关键字在接口内则不被需要。由于接口代表着一个对外行为的集合,所以任何方法在接口内都是public(公开的)。
    ##特点
  • 用关键字interface表示
    • interface 接口名{}
  • 类实现接口用implements表示
    • class 类名 implements 接口名{}
    • 接口的实现类名一般格式:接口名+Impl
  • 接口不能被实例化,但可以通过实现类来实例化,多态的方式
  • 接口的子类:
    • 抽象类
    • 具体类,要重写接口中所有抽象方法
interface Study {			//这是一个接口
	//这是一个静态常量,接口中的所有变量默认为静态常量
	public static final int x;		
	//接口中不存在构造方法
	//这是一个抽象方法,接口中所有成员方法默认为公共抽象方法
	public abstract void study();		
}
class People implements Study {	//这是接口的实现类
	@Override
	public study(){
		System.out.println("learn English");
	}
}

##成员特点

  • 成员变量:
    • 只能是常量,并且是静态的
    • 默认被public static final修饰
      建议自己手动给出
  • 构造方法:
    • 没有构造方法
  • 成员方法
    • 只能是抽象方法
    • 默认被public abstract修饰
    • 建议自己给出
      所有的类都默认继承自Object类, Object类是所有类层次的根类

##类与类,类与接口,接口与接口的关系

  • 类与类:

    继承关系,只能单继承,但是可以多层继承

  • 类与接口:

    实现关系,可以单实现,可以多实现
    并且还可以在继承一个类的同时实现多个接口
    格式:class 子类名 extends 父类名 implements 接口名1,接口名2{}

  • 接口与接口:

    继承关系,可以单继承,可以多继承
    格式:interface 接口名 extends 接口名1,接口名2 {}

##抽象类和接口的区别

  • 成员区别
    • 抽象类:
      1. 成员变量:可以是变量,可以是常量
      2. 成员方法:可以是抽象方法,也可以是非抽象方法
      3. 构造方法:有,用于创建子类对象时对父类数据的初始化
    • 接口:
      1. 只能是常量,并且是静态的
      2. 只能是抽象方法
      3. 没有构造方法
  • 关系区别
    • 类与类是继承关系
    • 类与接口是实现关系,可以单实现,可以多实现
    • 接口与接口是继承关系,可以单继承,可以多继承
  • 设计理念区别
    • 抽象类定义的是共性关系

      将几个类中相同的部分抽取出来写成一个类

    • 接口定义的是扩展关系

    定义原本不具备的功能,然后令其实现

interface Jump {
	public abstract void Jump();
}

interface Study {
	public abstract void Study();
}

interface Other extends Jump,Study {}

public abstract class Animal {
	public abstract eat();
	
	public void sleep() {
		System.out.println("sleep");
	}
}

public class Dog extends Animal implements Jump,Study {
	@Override
	public void eat(){
		System.out.println("狗吃肉");
	}
	
	@Override
	public void Study(){
		System.out.println("狗学钻火圈");
	}
	
	@Override
	public void Jump (){
		System.out.println("狗会跳高");
	}
}

猜你喜欢

转载自blog.csdn.net/yjh728/article/details/80572223
今日推荐