Java基础—面向对象02

 
 1.继承

    类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。

  想声明一个类继承另一个类,需要使用extends关键字。

 格式为:class 子类 extends 父类 {}

   作用:

继承的出现提高了代码的复用性,提高软件开发效率。

继承的出现让类与类之间产生了关系,提供了多态的前提。

在类的继承中,需要注意一些问题,具体如下:

1、在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类

2、多个类可以继承一个父类,例如下面这种情况是允许的。

3、在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如C类继承自B类,而B类又可以去继承A类,这时,C类也可称作A类的子类。

4、在Java中,子类和父类是一种相对概念,也就是说一个类是某个类父类的同时,也可以是另一个类的子类

 

  子类继承父类的一些特点:

  当子父类中出现了同名成员变量时,在子类中若要访问父类中的成员变量,必须使用关键字super来完成。super用来表示当前对象中包含的父类对象空间的引用。

 

在子类中,访问父类中的成员变量格式:

 

      super.父类中的成员变量

 例如

  

class Fu

 

{

 

//Fu中的成员变量。

 

int num = 5;

 

}

 

class Zi extends Fu

 

{

 

//Zi中的成员变量

 

int num = 6;

 

void show()

 

{

 

//子父类中出现了同名的成员变量时

 

//在子类中需要访问父类中非私有成员变量时,需要使用super关键字

 

//访问父类中的num

 

System.out.println("Fu num="+super.num);

 

//访问子类中的num2

 

System.out.println("Zi num2="+this.num);

 

}

 

}

 

class Demo5

 

{

 

public static void main(String[] args)

 

{

 

Zi z = new Zi(); //创建子类对象

 

z.show(); //调用子类中的show方法

 

}

 

}

 

 

 

 子父类成员方法特点-重写

 

     子父类中成员方法的特点

当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。

  代码演示:

class Fu{

 

public void show(){

 

System.out.println("Fu类中的show方法执行");

 

}

 

}

 

class Zi extends Fu{

 

public void show2(){

 

System.out.println("Zi类中的show2方法执行");

 

}

 

}

 

public  class Test{

 

public static void main(String[] args) {

 

Zi z = new Zi();

 

z.show(); //子类中没有show方法,但是可以找到父类方法去执行

 

z.show2();

 

}

 

}

 

成员方法特殊情况—覆盖

子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为override重写、复写或者覆盖。

 方法重写(覆盖)的应用:

 

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

  代码演示:

public class Test {

 

public static void main(String[] args) {

 

new NewPhone().showNum();

 

}

 

}

 

 

 

//手机类

 

class Phone{

 

public void sendMessage(){

 

System.out.println("发短信");

 

}

 

public void call(){

 

System.out.println("打电话");

 

}

 

public void showNum(){

 

System.out.println("来电显示号码");

 

}

 

}

 

 

 

//智能手机类

 

class NewPhone extends Phone{

 

 

 

//覆盖父类的来电显示号码功能,并增加自己的显示姓名和图片功能

 

public void showNum(){

 

//调用父类已经存在的功能使用super

 

super.showNum();

 

//增加自己特有显示姓名和图片功能

 

System.out.println("显示来电姓名");

 

System.out.println("显示头像");

 

}

 

}

 

重写注意事项:

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

 

写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样。

 

总结:当一个类是另一个类中的一种时,可以通过继承,来继承属性与功能。如果父类具备的功能内容需要子类特殊定义时,进行方法重写。

 

2.抽象类

 

   方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

 

当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

 

抽象方法定义的格式:

 

public abstract 返回值类型 方法名(参数);

 

抽象类定义的格式:

 

abstract class 类名 {

 

}

 

代码演示:

//研发部员工

abstract class Developer {

public abstract void work();//抽象函数。需要abstract修饰,并分号;结束

}

 

//JavaEE工程师

class JavaEE extends Developer{

public void work() {

System.out.println("正在研发淘宝网站");

}

}

 

//Android工程师

class Android extends Developer {

public void work() {

System.out.println("正在研发淘宝手机客户端软件");

}

}

 

 

 

 

抽象类的特点

1)抽象类是一个父类,是不断抽取来的

2)抽象类可以不定义抽象方法,可以让子类去使用

3)private:私有的方法子类是无法继承到的,也不存在覆盖,而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。

 

 

 

 

 

3.接口

    接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”,接口只描述所应该具备的方法,并没有具体实现

 

具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计

 

  1) 接口的定义

  与定义类的class不同,接口定义时需要使用interface关键字。定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件

 

定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。

 

定义格式

 

public interface 接口名 {

 

抽象方法1;

 

抽象方法2;

 

抽象方法3;

 

}

 

 

 

使用interface代替了原来的class,其他步骤与定义类相同:

 

 接口中的方法均为公共访问的抽象方法

 

 接口中无法定义普通的成员变量

 

2)类实现接口

 类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements

其他类(实现类)实现接口后,就相当于声明:我应该具备这个接口中的功能。实现类仍然需要重写方法以实现具体的功能。

 

格式

 

class implements 接口 {

 

重写接口中方法

 

}

 

 

在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑

 

接口中定义功能,当需要具有该功能时,可以让类实现该接口,只声明了应该具备该方法,是功能的声明。

 

 在具体实现类中重写方法,实现功能,是方法的具体实现。

 

于是,通过以上两个动作将功能的声明与实现便分开了(类是现实事物的描述,接口是功能的集合。)

 

3)接口中成员的特点

 

1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解staticfinal关键字

 

2、接口中可以定义方法,方法也有固定的修饰符,public abstract

 

3、接口不可以创建对象。

 

4子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。

 

4)接口的多实现

 

接口最重要的体现:解决多继承的弊端。将多继承这种机制在java中通过多实现完成了。

 

接口和类之间可以通过实现产生关系,同时也学习了类与类之间可以通过继承产生关系。当一个类已经继承了一个父类,它又需要扩展额外的功能,这时接口就派上用场了。

 

子类通过继承父类扩展功能,通过继承扩展的功能都是子类应该具备的基础功能。如果子类想要继续扩展其他类中的功能,这时通过实现接口来完成。

 

接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能。

 

5)接口的多继承

 

类与类之间可以通过继承产生关系,接口和类之间可以通过实现产生关系,那么接口与接口之间会有什么关系。

 

多个接口之间可以使用extends进行继承

 代码展示:

interface Fu1{

 

void show();

 

}

 

interface Fu2{

 

void show1();

 

}

 

interface Fu3{

 

void show2();

 

}

 

interface Zi extends Fu1,Fu2,Fu3{

 

void show3();

 

}

 

5)接口的思想

接口在开发中的好处有:

1、接口的出现扩展了功能。

2、接口其实就是暴漏出来的规则。

3、接口的出现降低了耦合性,即设备与设备之间实现了解耦。

 

接口与抽象类的区分:

相同点:

 

都位于继承的顶端,用于被其他类实现或继承;

 

都不能直接实例化对象;

 

可以包含抽象方法,其子类都必须覆写这些抽象方法;

 

区别:

 

抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;

 

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

 

抽象类是这个事物中应该具备的内容, 继承体系是一种 is..a关系

 

接口是这个事物中的额外内容,继承体系是一种 like..a关系

 

 

 

二者的选用:

 

优先选用接口,尽量少用抽象类;

 

需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

 

 

 

 

 

 

 

 

 

 

 

posted on 2019-09-05 11:38  小蜘zhu  阅读(125)  评论(0编辑  收藏  举报