【Java】继承、抽象、接口和包

来源:互联网 发布:空气污染指数的算法 编辑:程序博客网 时间:2024/06/06 08:04

一、继承

在面向对象编程中,类继承包括:单继承和多继承。

单继承表示子类只能有一个父类,但是一个父类可以派生出多个子类,也就是说子类和父类是多对一的关系;而多继承则是多对多的关系。

java里只支持单继承。

类继承通过关键字extends来实现。
语法为:
[修饰符] class 子类 extends 父类名{
//子类属性和方法定义
}

java里修饰符分为几种:
1.访问修饰符:
a.public;公有的(类似公共厕所)
b.protected;包内可见(类似家里的厕所)
c.private;私有(老爸主卧专用厕所)
d.默认访问修饰符(default)包内可见

2.abstract:用来修饰类和方法,不能被实例化,而且必须要实现;

3.final:用来修饰类、方法、属性。修饰类的时候,表明是最终类,不得被继承,没有子类;修饰方法的时候,表明是方法不可被覆盖;修饰字段(属性)的时候,表明属性的值一旦被定义不得被修改;

4.static:用来修饰内部类、方法、属性。修饰内部类的时候表明该类属于某外部类而不属于类的某个实例;修饰方法的时候表明属于某个类而不是类的实例;同样的,修饰字段的时候,表明属于某个类而不是类的实例。因此,static修饰的,不能被实例化,不能new,不能用this;

子类继承父类所有的非私有成员(方法和属性)。
那么问题来了,如果当子类定义了和父类相同名字的方法和属性,那么当new出一个子类对象的时候,运行的同名方法和属性应该是子类的还是父类的呢?

1.域的隐藏(同名属性)

这里的域指的就是属性、字段。
当子类和父类定义了同名不同类型属性,当new一个子类对象时,应执行的是子类属性,而隐藏了父类字段,这就是域的隐藏。

2.方法的覆盖(同名方法)

子类和父类定义了相同的方法(方法名相同、参数个数,顺序,类型都相同、返回类型相同),这叫做覆盖。

有了这两个特点,子类可以运行自己的属性方法而不是受父类牵制。
可是当子类想用父类的属性和方法又要如何操作呢?
这里就引入了一个关键字super。

3.Super关键字

super有两个用途:
1.用于访问直接父类被子类隐藏的域和被覆盖的方法;
2.用于调用直接父类的构造方法,并对其类成员进行初始化。
(一般默认调用的是父类无参数的构造方法,对于带参的构造方法就要用super(具体参数值))
还要注意的一点是,this和super不能同时使用,因为两者都要放在第一行。

二、抽象

(1)抽象方法只能在抽象类中定义;
(2)不能用abstract来修饰构造方法,因为构造方法是不能被继承的。
(3)抽象方法不能实例化对象。
————————————————————————————
但是,如果要使一个子类同时拥有多个类的特征的话怎么办呢?
Java里用接口解决了这个问题。

三、接口

一个类不是通过继承来实现接口的,而是通过实现接口里的抽象方法。
其实我觉得接口这个名字非常形象,就像充电的插座插口,你可以用它给手机充电,可以用来给吹风机吹头发,可以给电饭锅煮饭等等,每个具体的电器(类)的实现方式都不同,也实现了不同功能,(这也是所谓的多态),在接口里定义了他们相同的抽象方法(用电),然后让他们各自以不同的功能来实现这个接口。

定义接口的关键字是interface,类实现接口的关键字是implements

原创粉丝点击