Java面向对象(3)
抽象类
1)由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体的实现,用一个分号结尾;
2)一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类;
3)如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)。
抽象类不可以实例化
1)抽象类不可以实例化,例如。如果shape时抽象类的话,下面的代码是错误的;
shape s1=new shape();
2)即使一个类中没有抽方法,也可以将其定义为抽象类,同样,该类不可以被实例化。
3)abstract和final关键字不可以同时用于修饰一个类,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。
继承抽象类
1)一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。
抽象类的意义
抽象类的意义在于:
---为其子类提供一个公共的类型;
---封装子类中的重复内容(成员变量和方法);
---定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
接口
定义一个接口
1)接口可以看成是特殊的抽象类。即只包含有抽象方法的抽象类;
注意:通过interface关键字定义接口,接口中不可以定义成员变量,但可以定义常量。接口中只可以定义没有实现的方法(可以省略public abstract)。
实现接口
1)与继承不同,一个类可以实现多个接口,实现的接口直接用逗号分隔。当然,该类需要实现这些接口中定义的所有方法;
2)一个类可以通过implements关键字“实现”接口。一个类实现了某个接口后必须实现该接口中定义的所有的方法。、
3)接口可以作为一种类型的声明变量,一个接口类型的变量可以引用实现了该接口的类的对象;通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现)。
接口 继承
接口间可以存在继承关系,一个接口可以通过关键字extends关键字继承另外一个接口。子接口继承了父接口中定义的所有方法。
接口和抽象类的区别
含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。含有abstract方法的类必须定义为abstract class,抽象类中的方法不必是抽象的。抽象类中定义的抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中所以抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中定义的方法都必须是抽象的,不能有非抽象的普通方法。
4.抽象类中的抽象方法的访问类型可以是public ,private和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5.抽象类中可以包含静态方法,接口中不能包含静态方法
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final 类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个实现类。
下面说一下两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;
而抽象类在代码实现方面发挥作用,可以实现代码的重用。
多态
多态的意义
1)一个类型的引用在指向不同的对象时会有不同的实现
2)同样一个对象,造型成不同的类型时,会有不同功能
向上造型
1)一个类的对象可以向上造型的类型有:
----父类的类型
----其实现的接口类型
2)Java编译器根据类型检查调用方法是否匹配。
强制转型
1)可以通过强制转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是子类类型。
2)也可以通过强制转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口
3)如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException
instanceof关键字
1)在强制转型中,为了避免出现ClassCastException,可以通过instanceof关键字判断某个引用指向的对象是否为制定==指定类型。
Java中实现多态的机制:
通过继承父类或实现接口。不同子类或实现父类方法有不同的实现。根据对象调用相应的实现方法。另外对于相似的方法,可以使用重载。
内部类
1)一个类可以定义在另外一个类的内部,定义在类内部的类称为内部类(Inner),其所在的类称之为外部类()Outer;
2)Inner定义于Outer的内部。通常只服务于Outer,对外部不具备可见性,Inner可以直接调用Outer的成员及其方法(包括私有的)。
创建内部类对象
一般情况下,Inner对象会在Outer对象中创建(构造方法或其他方法);Inner对象中会有一个隐式的引用指向创建它的Outer对象。
定义匿名内部类
如果在一段程序中需要创建一个类的对象(通常这个类需要实现在某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。
//SuperType:用匿名类所实现的接口或所继承的父类类型声明的引用
SuperType obj=new SuperType(...){
//匿名中定义的成员变量或方法
};
注意:
内部类就是在一个类的内部定义的类。内部类可以定义在除了参数位置上的任意位置。
(1)静态内部类需要使用static修饰,而普通内部类不能使用static修饰
(2)静态内部类只能定义在和属性同级,普通内部类可以定义在除了参数位置以外的任意位置
(3)静态内部类必须有名称,而普通内部类可以是匿名的
(4)静态内部类没有this引用,因此只能访问外部类的静态成员,而普通内部类可以访问外部类的全部成员
(5)静态内部类访问外部类的同名函数时,使用“外部类名.方法名”即可,而普通内部类需要使用“外部类名.this.外部方法”
(6)静态内部类可以定义静态方法,而普通内部类不能定义静态方法
内部类可以引用它的包含类的成员吗?有没有限制?
1)如果内部类为静态内部类,只能调用外部类的静态成员:如果有重名成员,需要用“外部类名.成员名”访问;不能调用外部类的对象成员。
2)如果内部类为非静态内部类,则可以调用外部类的所有成员;如果有重名成员,需要使用“外部类名.this.外部方法”
面向对象的特征有哪些方面?
1)封装,隐藏内部实现,只暴露公共行为
2)继承,提高代码的重用性
3)多态,体现现实生活中相似对象的差异性
4)抽象,抽取现实世界中相似对象的共同点
浙公网安备 33010602011771号