Java基础知识十一(接口与抽象类)

接口:

接口:当一个抽象类,如果抽象类中的所有方法都是抽象的,那么我们就可以把它定义为一个接口,接口是对行为的抽象。类是对属性和行为的抽象。
代码表示:
interface 接口名{
	方法定的定义;
	….
}

定义普通的类或者抽象类可以使用class关键字,定义接口必须interface关键字完成

interface class Demo
{
        abstract void show1();
        abstract void show2();
}

接口的特征:
1、接口中的方法的定义不需要Abstract来修饰,默认就是抽象的。
2、接口是不可以实例化的,需要有类来实现接口的语法。

class 类名	implements 接口名,接口名,…{
		//实现每一个接口中的方法
	}

接口中成员的特点:
  1. 接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以
    接口中的变量也称之为常量。
  2. 接口中可以定义方法,方法也有固定的修饰符,public abstract
  3. 接口中的成员都是公共的。
  4. 接口不可以创建对象。
  5. 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽
    象类
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(){}
}
接口最重要的体现:

解决多继承的弊端。将多继承这种机制在java中通过多实现完成了.
弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。
其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。
因为接口中的功能都没有方法体,由子类来明确。故可以很好的解决多继承的问题。
子类继承父类的同时实现接口:

class Fu
{
        public void A(){}
}
interface C
{
        pulbic void B();
}
class Zi extends Fu implements C
{
        public void B()
        {
              
        }
}

接口的出现避免了单继承的局限性。
父类中定义事物的基本功能,接口中定义事物的扩展功能。
接口之间的多继承:
多个接口之间可以使用extends进行继承

interface A{//接口A
        void show();
}
interface B{//接口B
        void show1();
}
interface C{//接口C
        void show2();
}
interface D extends A,B,C{//接口D继承接口A,B,C
        void show3();
}

如果遇到多个接口中有相同的方法,若此时有一个类实现了这些接口,那么就要实现接口中的方法,但是接口中的方法时抽象方法,所以子类实现后也不会发生调用的不确定性。

抽象类:

抽象类由来
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的行为方
式,那么这些方法都有具体的方法体。
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类
如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算
法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是功能声
明相同,但功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那
么此方法就是一个抽象方法。
描述狗:行为:吼叫
描述狼:行为:吼叫
狗和狼之间有共性,可以进行向上抽取。抽取它们的所属共性类型:犬科。由于狗和狼
都具有吼叫功能,但是他们具体怎么吼叫却不一样。这时在描述犬科时,发现了有些功能
(吼叫)不具体,这些不具体的功能,需要在类中标识出来,通过java中的关键字
abstract(抽象)。
当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽
象类

abstract class 犬科
{
    static abstract void 吼叫();//抽象函数。需要abstract修饰,并分
号;结束
}
class Dog extends 犬科
{
    void 吼叫()
    {
        System.out.println("汪汪汪汪");
    }
}
class Wolf extends 犬科
{
    void 吼叫()
    {
        System.out.println("嗷嗷嗷嗷");
    }
}

抽象类的特点

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

4、抽象类一定是一个父类。
5、抽象类有构造函数,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始哈。

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

相同:

它们都是用来描述事物的。
它们之中都可以定义属性和行为。
不同:
 
	一般类可以具体的描述事物。抽象类描述事物的信息不具体
	抽象类中可以多定义一个成员:抽象函数。
	一般类可以创建对象,而抽象类不能创建对象。

抽象类中可以不定义抽象方法。
抽象关键字abstract不可以和哪些关键字共存?

final:fianl修饰的类是无法被继承的,而abstract修饰的类一定要有子类.final
修饰的方法无法被覆盖,但是abstract修饰的方法必须要被子类去实现的。
static:静态修饰的方法属于类的,它存在与静态区中,和对象就没关系了。而
抽象方法没有方法体,使用类名调用它没有任何意义。
private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和
private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类
根本无法得到父类这个方法。互相矛盾
发布了48 篇原创文章 · 获赞 47 · 访问量 5247

猜你喜欢

转载自blog.csdn.net/weixin_45160969/article/details/103486695
今日推荐