抽象类
v 抽象类:用abstract关键字来修饰一个类时,该类叫做抽象类;
§ 抽象类必须被继承。
§ 抽象类不能被直接实例化。它只能作为其它类的超类,这一点与最终类(final类)正好相反。
abstractclass ClassName{
}
抽象方法
v 抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。
§ 抽象方法必须被重写
§ 抽象方法只有声明,不能有实现。
§ 定义了抽象方法的类必须是抽象类。
abstractreturnType abstractMethod ( [paramlist] );
什么是接口
v 接口(interface)就是方法定义和常量值的集合。从语法上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。
§ 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
§ 通过接口可以指明多个类需要实现的方法。
§ 通过接口可以了解对象的交互界面,而不需了解对象所对应的类。
接口的定义
v 接口的定义:
[public] interface interfaceName[extends SuperInterfaceList]{
…… //常量定义和方法定义
}
v 接口(interface)作为特殊形式的抽象类,和类(class)在使用上具有类似的约束。
§ 与类继承不同,一个接口可以继承多个父接口
§ 一个public接口只能定义在同名的.java文件中
v 用implements子句来表示一个类使用某个接口。
v 在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。
v 利用接口可实现多重 继承,即一个类可以实现多个接口,在implements子句中用逗号分隔。
v 接口的作用和抽象类相似,只定义原型,不直接定义方法的内容。
v 接口中的方法和常量必须是public的。
理解接口
v 接口的语法很容易记住,但真正理解接口不容易:
- 接口只关心功能,并不关心功能的具体实现
- 接口的思想在于它可以增加很多类都需要的功能,使用相同的接口不一定有继承关系。
抽象类与接口异同点
v 相同点:
§ 都必须通过其它类实现才能使用;
v 不同点:
§ 抽象类是类,其中可包含变量及(抽象)方法的定义;
§ 接口实质并不是类,其中只包含类常量及抽象方法的定义;
何时使用抽象类及接口
v 抽象类和接口是作为对象的描述,在底层设计时用到。接口更偏重于对象所具有的功能。
- 存在继承关系,或有公共方法且实现功能一样时,使用抽象类。
- 只关心功能存在性时,使用接口。
内部类的定义
在一个类的内部声明的类,称为内部类。内部类编译后也会形成一个单独的class,但它附属于其包含类。
内部类标识符
v 内部类标识符是
外围类的名字+$+内部类的名字
v 匿名的内部类是没有名字的内部类,内部类是匿名的,则会由编译器产生一个数字作为其标识符
外围类的名字+$+数字
何时使用内部类及(好处)
v 使用内部类好处: 可以直接使用该包含类的变量和方法。
内部类只能在包含它的类中使用,同时它可以看作是该包含类的一段特殊代码。
v 何时何处使用内部类: 当一个类能直接访问另一个类中的成员时,将第一个类定义为第二个类的内部类。
v java中内部类多用在GUI(图形用户界面)部分的事件处理机制中。
要点补充:
=========================抽象类========================================
用abstract修饰的类称为抽象类,所谓抽象类是指不能直接实例化对象的类。
如果一个抽象类被说明了,则这个类中将包含一个或几个抽象方法。
所谓抽象方法是指该方法只有方法说明却没有方法体,即没有具体的代码。
抽象类本身不具备实际功能,它只能用于衍生子类。
抽象类中不一定包含抽象方法,但一旦某个类中说明了抽象方法,该类必须说明为抽象类。
============================加深抽象类的理解=====================
抽象类体现的的就是一种模板模式的设计。
抽象类是从多个具体类中抽象出来的父类。
从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,
从而避免了子类设计的随意性。
如果编写一个抽象父类,父类提供了多个子类的通用方法,
并把一个或多个抽象方法留给其子类实现,这就是一种模板模式。
模板模式也是最常见,最简单的设计模式之一。
=========================抽象类与普通类的区别=========================
抽象类与普通类的最重要的区别是从面向对象的角度来出发进行解释的,
抽象类描述的是非具体的东西,比如说形状,这就是非具体的,形状分为三角形,正方形。圆形等等,
普通类就更具体了,三角形就就可以作为一个普通类来对待的。
比如说动物这个抽象类,它可以有吃或者运动的方法,
但是不能有方法体,因为动物有好多种,不知道它吃什么怎么运动,
派生出子类Bird就可以写方法体了,它吃虫子,飞行。就这样。。。
总的来说就是:接口必须全部实现,抽象类只实现抽象方法,继承类可以不实现。
================================
1:抽象方法:
当父类的某个方法都会被子类重写时,那么父类的方法就没有实现的必要。但必须要声明。
所以这个方法就可以定义抽象方法(只有声明,没有实现)。
2:抽象类:
由于抽象方法是不完整的方法,因而抽象方法所属的类也是一个不完整的类,所以类必须定义成
抽象类。
抽象类中可以包含抽象方法和非抽象方法。
3:当一个子类继承抽象类时,子类就必须重写抽象类中的所有的抽象方法。
如果子类不想实现,那么必须将自已也定义一个抽象类。
4:抽象类不能被实例化,只能实例化子类。
Animal animal = new Dog_WC();
这种代码的实例又实现的类型的上溯,肯定实现方法的多态。
接口:
接口是一个特殊的抽象类。只包含常量和方法的定义。
接口中定义的变量都是变量(默认使用public static final修饰)
接口中定义的方法都是抽象方法(默认使用public abstract修饰)
接口由于是一个特殊的抽象类,所以接口也不能被实例化。
实例化的也是接口的子类。子类继承父类,实现一个或者多个接口。
public class TestImp extends Animal
implements TestIFC, TestIFC2 {
}
由于类实现接口,也继承接口定义的常量。重写了接口中的方法。实现了多继承的关系。
接口不能被实例化,只实例化接口的实现类。
注意点:实现多个接口时,多个接口中不要定义相同名称的接口方法。
接口与抽象类的关系
接口只能继承接口,不能继承抽象类。
抽象类只能继承抽象类,抽象类可以实现接口。
何时使用接口与抽象类。
抽象类是类,其中可包含变量及(抽象)方法的定义。
比较注重描述对象以及对象与对象之间的继承关系。
接口实质并不类,其中只包含类常量及抽象方法的定义。
只关心很多类都需要的功能以及功能的实现。
如开/关,比较适合定义成接口方法。
如开门/关门:比较适合定义成抽象方法
============================================================
其实abstractclass表示的是"is a"关系,interface表示的是"like a"关系,
大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的
类的分类:
外部类:
在class{}外面定义的类,就是外部类。
外部类可以供其它类调用。
内部类:在class{}内部定义的类,就是内部类。
内部类只能给本身的类调用。
内部类可能直接调用所属外部类的属性和方法。
System.out.println(i);
System.out.print(TestInnerClass.this.i);
生成class的格式
外部类.class $ 内部类.class
匿名类:
用内部类是为了更好的封装代码 因为内部类可以作为外部类的成员
就是不起名字的类,有时候某个类只用一次没有必要为它起一个名字,所以直接把类的内容写在
那里就可以了不再起名字了
最外层的内为顶层类.
内部类所在的类称为外部类。
在一个类的内部定义的类称为内部类。
内部类:
成员内部类
实例内部类
静态内部类
局部内部类
顶层类只能处于public和默认访问级别,而成员内部类可以处于public、protected、private
、默认四种级别。
实例内部类
1.在创建实例内部类的实例时,外部类的实例必须已经存在。
2.实例内部类的实例自动持有外部类的实例的引用。
在内部类中,可以直接访问外部类的所有成员。包括成员变量和成员方法、
3.在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。
4.在实例内部类中不能定义静态成员,只能定义实例成员。
5.如果在实例内部类与实例外部类中包含相同的成员,在内部中用this.v来表示。A.this.v表
示外部类的成员
静态内部类
1.创建静态内部类不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外
部类的实例。
2.静态内部类可以直接访问外部类的静态成员,外部类的实例成员必须通过外部类的实例去访问
。
3.在静态内部类中可以定义静态成员和实例成员
4.客户通过完整的类名在直接访问静态内部类的静态成员
局部内部类:
是在一个方法中定义的类,无法用public,protected,private,static来修饰。
1.只能在方法内部使用
2.不包含静态成员
3.可以访问外部类的所有成员
匿名类:是一种特殊的类,这种类没有名字。
1.匿名类没有构造函数,会调用父类的构造函数
2.匿名类除了可以继承类以外,还可以实现接口。
3.匿名类和局部内部类一样,可以访问外部类的所有成员。
作用
1.封装类型
2.直接访问外部类的成员
3.回调外部类的方法