[Java之二]继承与接口

来源:互联网 发布:dnf额外暴击伤害算法 编辑:程序博客网 时间:2024/06/03 20:47

[Java之二]继承与接口

先分享一款产品

PH-1
被媒体誉为安卓之父的安迪•鲁宾,最近发布了一款新的手机,PH-1

(这样的占屏比,让我觉得,小米拿下了首杀)

这部手机其实没有这么简单,一块屏幕也不是让我拿出来说的一点,真正让我喜欢的点,是它:

它的各个功能模块,都有磁铁和其他绑定其他设备的方式,这个体现呢他的模块化的理念,简单的理解就是,手机现有的一些功能可以通过其他设备进行加强,也可以用一些小配件增添其他功能。
那么问题来了。这样做有什么好处?

仔细想想其实很简单,手机的技术再好,也无法一次性的将所有最好技术都运用在一部手机上,这会增加很大的成本,和技术难题。将手机硬件的的各个功能“开源”,让其他专业做某一个功能的厂商提供更好的配件,让手机本身可以拥有更好的体验。可拆卸,可组合,功能更强大,更有乐趣。这是“开源”的力量,也是取长补短的智慧。

为什么要提它?

我们的Java和它一样,也是运用了这个智慧,让其更加强大。我们自己编写的类中很多属性和方法在其他类中已经有了,为了简化我们的工作,Java中有了【继承】。对于一些专门的方法,我们可以建立一个简单的【接口】,等需要的时候我们直接接入类中,拿来使用。

来,我们来进一步认识它们。

一.继承

1.格式:

如果A继承了B,也就是说,A拥有了B的所有属性,和方法。这时A叫做【子类】,B叫做【父类】。

格式: 关键字是: extends
书写方法: public class 子类名 extends 父类名{

            }

这样,如果你要创建一个类(A),其部分功能在另一个类(B)中都拥有,那么你只需要让这个类(A)继承类(B)就可以了。减少了编写的工作量。

2.例子

我们需要一个创建两个对象(鸣人和佐助)。如果不使用【继承】,那么我们分别需要编写两个类。可是,我们发现他们两个类都有共同的特征,那么我们将这些共同特征编写一个父类(人)。然后让他们作为子类【继承】一下,就可以了

那么我们开始:

编写他们的父类(人)

public class Person {
public String name;
public int life;
public int gongji;
public void beat(Person p){

p.life = p.life-gongji;}public void show(Person x){    System.out.println(x.name+"还有"+x.life);    if(x.life<=0){        System.out.println(x.name+"被揍飞");    }}

}
让子类(鸣人和佐助)【继承】这个父类

A(鸣人)

public class Mingren extends Person {

}
B(佐助)

public class Zuozhu extends Person {

}
简单的继承就是这个样子。

3.注意点

<1>子类继承了父类,那么子类就拥有父类的所以属性和方法。但是由于父类中访问权限不同, 有些子类无法访问。

<2>一个子类只能继承一个父类

<3>Java对于有些父类的方法没法满足子类需求时,Java有一个【重写机制】

【重写机制】:当父类的方法不满足子类的需要时,子类可以重新定义该方法。

要求:

1:必须要有继承关系。

2:方法的声明除了访问权限,其他必须一样。

以鸣人这个子类举例子

public class Mingren extends Person {

public class void beat(Person p ){
gongji=gongji*2;
super.beat(p); //包含了很多的以前的方法
gongji=gongji/2; //在以前的基础上做了改进
}
}

二.接口

我们来看看,拥有了【继承】Java还有哪些不方便?

我们来看这个地方:

<2>一个子类只能继承一个父类
那么我们总有一些东西是我们无法以继承的方式来编写的。可是那些需要大量重复书写,和模块化比较明显的程序,我们该怎么办呢?

来继续顺着我举得那个手机的例子,如果不能达到一揽子的满意,那么我们可不可以也像手机通过配件的方式,使Java成为编写给方便了呢?

当然,这里就有了【接口】。

1.格式

定义: 关键字 interface

public interface 接口名{

}

上面是对接口的编写

下面是对类的编写,进行对比。

public class 类名{

}

【接口】的属性: [public static final] 数据类型 属性名;

final : 最终的,不可修改的,修饰属性则属性在声明的时候必须初始化。

【接口】方法:[public abstract] 返回值类型 方法名(参数);

abstract :抽象的,修饰方法时,则方法不能有方法体。

2.例子

public interface USB {

//定义USB接口的宽度属性public static final int width = 20;//定义USB接口的高度属性int height = 5;//输入数据public abstract void input();//输出数据void output();

}
其中:

public static final int width = 20;

int height = 5;
它们都是属性的描写方式,区别在于:

<1>.【接口】属性 的[public static final]可以省略,接口会自动补全

<2>.属性必须有初始值

其中:

public abstract void input();

void output()
它们都是方法的描写方式,区别在于;

<1>.【接口】方法的[public abstract]可以省略

<2>.【接口】的方法没有不能实现

3.接口的运用

接口就是手机的配件,只有和手机连接在一起才意义。这里说的【手机】是【类】,【配件】是【接口】,其用implements连接

举例:

public class Mouse implements USB{

//重写USB的输入数据方法public void input(){    System.out.println("鼠标输入数据");}public void output(){    System.out.println("鼠标输出数据");}

}

可以看出:

<1>【接口】的方法在连接【类】后所有的方法必须重写

<2>implements在【类】的后面,在【接口】前面

最后

隐喻和类比是伟大的学习方法

以上