黑马程序员_抽象类



------- android培训java培训、期待与您交流! ----------

1-2 抽象类

1-2-1 抽象类概述


抽象定义:

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

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


抽象类:

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


抽象方法的由来:

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

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


1-2-2 抽象类的特点

抽象类和抽象方法必须用abstract关键字来修饰。


抽象方法只有方法声明,没有方法体,定义在抽象类中。

格式:修饰符 abstract 返回值类型 函数名(参数列表);


抽象类不可以被实例化,也就是不可以用new创建对象。

原因如下:

1、抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。

2、而且抽象类即使创建了对象,调用抽象方法也没有意义。

3、抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。


1-2-3 抽象类相关问题

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

答:有,用于给子类对象进行初始化。


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

答:private、static、final。


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

答:可以,但是很少见。目的就是不让该类创建对象,AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是却没有内容。


抽象类和一般类的区别?

相同点:

抽象类和一般类都是用来描述事物的,都在内部定义了成员。

不同点:

1、一般类有足够的信息描述事物。抽象类描述事物的信息有可能不足。

2、一般类中不能定义抽象方法,只能定义非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。

3、一般类可以被实例化。抽象类不可以被实例化。


抽象类一定是个父类吗?

答:是的,因为需要子类覆盖其方法后才可以对子类实例化。


1-2-4 接口

当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口。

 格式:interface{}


接口中的成员修饰符是固定的

成员常量:public static final

成员函数:public abstract

由此得出结论,接口中的成员都是公共的权限。


接口是对外暴露的规则。

接口是程序的功能扩展。


注意:

1、虽然抽象类中的全局变量和抽象方法的修饰符都可以不用写,但是这样阅读性很差。所以,最好写上。

2、类与类之间是继承关系,类与接口直接是实现关系。

3、接口不可以实例化,只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化。否则,这个子类就是一个抽象类。


接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。

在java中不直接支持多继承,因为会出现调用的不确定性。

所以,java将多继承机制进行改良,在java中变成了多实现,一个类可以实现多个接口。

接口的出现避免了单继承的局限性。

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


抽象类和接口的异同点?

相同点:

都是不断向上抽取而来的。

不同点:

1、抽象类需要被继承,而且只能单继承。接口需要被实现,而且可以多实现。

2、抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。接口中只能定义抽象方法,必须由子类去实现。

3、抽象类的继承,是is a关系,定义该体系的基本共性内容。接口的实现是like a关系。


1-2-5 多态

定义:某一类事物的多种存在形态。

例:动物中猫,狗。

猫这个对象对应的类型是猫类型:猫 x = new 猫();

同时猫也是动物中的一种,也可以把猫称为动物:动物 y = new 猫();

动物是猫和狗具体事物中抽取出来的父类型。

父类型引用指向了子类对象。

多态性简单说就是一个对象对应着不同类型。


体现:

父类或者接口的引用指向或者接收自己的子类对象。

作用:

多态的存在提高了程序的扩展性和后期可维护性。

前提:

1、需要存在继承或者实现关系。

2、需要有覆盖操作。

好处:

提高了代码的扩展性,前期定义的代码可以使用后期的内容。

弊端:

前期定义的内容不能使用(调用)后期子类的特有内容。


多态时,成员的特点:

1、成员变量

编译时:参考引用型变量所属的类中的是否有调用的成员变量。有,编译通过,没有,编译失败。

运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。

简单说:编译和运行都参考等号的左边。

2、成员函数(非静态)

编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过。没有,编译失败。

运行时:参考的是对象所属的类中是否有调用的函数。

简单说:编译看左边,运行看右边。

3、静态函数

编译时:参考的是对象所属的类中是否有调用的函数。

运行时:参考的是对象所属的类中是否有调用的函数。

简单说:编译和运行看左边。


1-2-6 内部类

定义:

将一个类定义在另一个类的里面,里面那个类就称为内部类(内置类,嵌套类)。

访问特点:

内部类可以直接访问外部类中的成员,包括私有成员。

而外部类要访问内部类中的成员必须要建立内部类的对象。


内部类的位置

内部类定义在成员位置上,可以被private、static成员修饰符修饰。被static修饰的内部类只能访问外部类中的静态成员。


注意:

1、如果内部类中定义了静态成员,该内部类也必须是静态的。

2、为什么内部类能直接访问外部类中的成员呢?

那是因为内部类持有了外部类的引用,外部类名.this。

3、内部类定义在局部位置上,也可以直接访问外部类中的成员。

同时可以访问所在局部中的局部变量,但必须是被final修饰的。


匿名内部类

定义:就是内部类的简化写法。

前提:内部类可以继承或实现一个外部类或者接口。

格式:new外部类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容)}

简单理解:就是建立一个带内容的外部类或者接口的子类匿名对象。

什么时候使用匿名内部类呢?

通常在使用方法是接口类型参数,并且该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。

好处:增强阅读性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值