您的位置:首页 > 职场人生

黑马程序员_Java继承与接口

2014-07-30 13:26 260 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



继承概述:

      1、继承Java是面向对象的最显著的一个特征。

      2、继承是从已有的类中派生出新的类,子类继承父类,避免重复的行为定义,直接使用父类的属性和方法,并能自定义之间的特有方法。
继承的好处:
1、提高了代码的复用性
2、让类与类之间产生了关系,为第三个特性多态提供了前提。

Java继承特点:只支持单继承,不支持多继承,因为多继承容易出现安全隐患:

当多个父类中定义了相同名字的功能,但功能内容不同时,子类对象调用该功能,不确定要运行哪一个。

<span style="font-size:18px;">class Fu1
{
void show()
{

}
}

class Fu2
{
void show()
}

class Zi extends Fu1,Fu2
{
//多个父类中定义的方法名都一样,这时子类无法确定调用哪个父类中的show()方法。
new Zi.show();
}</span>
继承体系:

Java支持多层继承,也就是继承关系是传递的。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。

示例: class C extends B 

        class Bextends A
如何使用一个继承体系中的功能?

首先查阅体系中父类的描述,因为父类中定义的是该体系中共性功能,通过了解共性功能,就可以知道该体系的基本功能,那么这个体系就已经可以基本使用了。

学习一个体系时,先看顶层,了解该体系中具备的基本功能,使用时,找体系最下面的对象。

什么时候定义继承?

面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,如何正确判断使用继承的时机,以及继承后如何活用多态,才是学习继承时的重点。

当事物之间存在着所属(is a)关系时,可以通过继承来体现这个关系。

为什么在具体调用时要创建最子类对象?

1、有可能父类不能创建对象 //例如该父类是个接口,或者抽象类

2、子类对象可以使用更多的功能,包括基本的也包括特有的。

super关键字:

1、super和this的用法相似。

2、super和this的区别:

    this:代表的是本类的对象引用

    super:代表的是父类的那片空间,而不是父类对象引用

<span style="font-size:18px;">class Fu
{

}

class Zi extends Fu
{
//打印的是调用this的子类对象的哈希值
System.out.println(this);
//编译失败
System.out.println(super);
}</span>

继承中关于private关键字的疑问:

    继承时,被private关键字修饰的成员会被继承,只不过子类无法直接存取,必须通过父类的方法来存取(如果父类有提供访问方法的话。)

继承中成员变量的特点:

    当子父类中出现同名变量时,运行的是子类的变量,因为变量前面省略了this关键字,如果想运行父类的变量,可以在变量前加上super关键字。

子父类中函数的特点:

    覆盖(重写):当子父类中出现同名函数时,运行的是子类中的函数,因为子类函数覆盖了父类函数,这是函数的另一特性:覆盖。

在覆盖要注意的以下几点:

    1、子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

    2、覆盖的方法的返回值,参数列表,函数名必须和被覆盖的方法一致才能称为覆盖。

    3、静态只能覆盖静态,或者被静态覆盖。

    4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

子父类中构造函数的特点:

    在子类的所有的构造函数的第一行默认都有一个隐式的super();语句。

为什么子类对象初始化都要访问父类中的构造函数呢?

    因为子类继承了父类中的内容,所以创建对象时必须要先看父类是如何对内容进行初始化的。

注意:

    当父类中没有空参数构造函数时,子类需要通过显示定义super语句指定要访问的父类中的构造函数。

    this和super用于调用构造函数时,不可以同时存在,因为他们都只能定义在第一行。

    用来调用父类构造函数的super语句在子类构造函数中必须定义在第一行,因为父类的初始化动作要先完成。但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。
<span style="font-size:18px;">    class Fu
{

Fu(int x)
{
x = 2;
System.out.println("Furun"+x);
}

}

class Zi extends Fu
{
Zi()
{
super();//编译失败,因为父类中定义了构造函数,系统不会自动定义默认的控参数构造函数。
super(5);//编译通过。
System.out.println("Zirun");
}
}</span>


继承弊端:打破了封装性,所以Java引进了final关键字来限制。

final关键字:


1,final是一个修饰符,可以修饰类,方法,变量。

2,final修饰的类不可以被继承。

3,final修饰的方法不可以被覆盖。

4,final修饰的变量是一个常量,只能赋值一次。

为什么要用final修饰变量:

    其实在程序如果一个数据是固定的,那么直接使用这个数据就可以了,但是这样阅读性差,所以给该数据起个名字,而且这个变量名称的值不能变化,所以加上final固定。

常量写法规范:常量所有字母都大写,多个单词,中间用_连接。

对象实例化过程:

Person p = new Person();

1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下).

2,在堆内存中开辟空间,分配地址。

3,并在对象空间中,对对象中的属性进行默认初始化。

4,调用对应的构造函数进行初始化。

5,在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6,父类初始化完毕后,再对子类的属性进行显示初始化。

7,在进行子类构造函数的特定初始化。

8,初始化完毕后,将地址值赋值给引用变量.

abstract 抽象类

什么时候用抽象方法?

当一个事物出现了一些不确定的部分,这些不确定的部分也是该事物的功能,需要明确指出,但是无法定义主题,这时可以用抽象方法。

抽象类中有构造函数,用于给子类对象进行初始化

抽象类一定是个父类,因为需要子类覆盖其方法后才可以对子类实例化。

抽象类可以不定义抽象方法。目的就是不让该类创建对象。//通常这个类中的方法有方法体,但是却没有内容。(AWT的适配器对象就是这种类)

特点:
1、抽象方法一定在抽象类中;//抽象方法必须定义在抽象类中。该类必须也被abstract修饰。
2、抽象类不可以用new创建对象;//因为调用抽象方法没意义。
3、抽象类的方法要被使用,必须由其子类覆盖了所有的抽象方法后,建立子类对象调用,如果子类只覆盖了部分抽
a758
象方法,这个子类还是抽象类。

抽象类和一般类的异同点:
相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同点:
1、一般类中只能定义非抽象方法。抽象类中可定义抽象方法,同时也可以定义非抽象方法。
2、一般类可以被实例化,抽象类不可以被实例化。

接口概述:
1、当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface。
2、在java中不直接支持多继承,因为会出现调用的不确定性,所以java将多继承机制进行改良,在java中变成了多实现,接口的出现避免了单继承的局限性。
3、继承是为了获取体系的基本功能,想要扩展功能,可以通过实现接口来完成

接口格式特点:
常量:public static final
方法:public abstract

接口与类的关系:

1、定义接口使用的关键字不是class,是interface.

2、接口可以被类多实现,接口之间可以多继承。

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

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

接口的特点:

1、接口不可以创建对象,因为有抽象方法(子类对接口中的方法全部覆盖后,才能创建子类对象,否则该子类是一个抽象类)

2、一个类可以实现多个接口。

<span style="font-size:18px;">interface CC
{
void show();
}
interface MM
{
void method();
}

interface QQ extends  CC,MM//接口与接口之间是继承关系,而且接口可以多继承。
{
void function();
}

class WW implements QQ
{
//覆盖3个方法,如果没有全部覆盖,该类仍是抽象类。
public void show(){}
public void method(){}
public void function(){}
}</span>

接口的利弊:
利:可以让子类具备更多的功能,提高了代码的扩展性。
弊:调用的不确定性,原因在于方法主体内容不同。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐