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)抽象,抽取现实世界中相似对象的共同点

 

posted on 2017-08-22 16:14  左夕  阅读(135)  评论(0)    收藏  举报

导航