Java面向对象之继承

内容:

1、面向对象

2、继承的概念与使用

3、继承的特点和注意事项

4、Java为什么只支持单继承

5、向上抽取原则

6、方法重写

1、面向对象

(1)什么是面向对象

面向对象是一种编程思想、面向对象是相对于面向过程的

(2)面向过程与面向对象的区别

  • 面向过程:遇到一个问题,亲力亲为地一步一步解决它(小兵思想),典型的代表语言:c语言
  • 面向对象:遇到一个问题,找具有解决这个问题的对象,调用该对象的方法(老板思想),典型的代表语言:java语言

2、继承的概念与使用

(1)继承

Java中的继承是两个类之间的关系

一个类(子类/派生类/sub)可以继承另外一个类(父类/基类/超类/super),这个过程我们称为Java中的继承 

(2)继承使用

继承使用如下:

1 public class 父类{}
2 public class 子类 extends 父类{}

子类在继承父类的时候,会自动拥有父类的成员(private除外)

继承是面向对象的核心特性,是面向对象的学习重点,同时继承是代码复用的重要方式,是类与类之间的一种关系

子类访问父类成员变量:

 1 class Fu
 2 {
 3     //Fu中的成员变量。
 4     int num = 5;
 5 }
 6 class Zi extends Fu
 7 {
 8     //Zi中的成员变量
 9     int num2 = 6;
10     //Zi中的成员方法
11     public void show()
12     {
13         // 访问父类中的num
14         System.out.println("Fu num="+num);
15         // 访问子类中的num2
16         System.out.println("Zi num2="+num2);
17     }
18 }
19 class Demo 
20 {
21     public static void main(String[] args) 
22     {
23         Zi z = new Zi(); // 创建子类对象
24      // System.out.println(z.num);
25         // z.show(); //调用子类中的show方法
26     }
27 }

代码说明:Fu类中的成员变量是非私有的,子类中可以直接访问,若Fu类中的成员变量私有了,子类是不能直接访问的

另外若父类和子类中有同名成员变量时,使用子类的对象访问该成员变量时,优先访问子类自己的

子类中访问父类成员方法:

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

 1 class Fu{
 2     public void show(){
 3         System.out.println("Fu类中的show方法执行");
 4     }
 5 }
 6 class Zi extends Fu{
 7     public void show2(){
 8         System.out.println("Zi类中的show2方法执行");
 9     }
10 }
11 public  class Test{
12     public static void main(String[] args) {
13         Zi z = new Zi();
14         z.show(); // 子类中没有show方法,但是可以找到父类方法去执行
15         z.show2();
16     }
17 }

(3)继承的作用

  • 子类自动拥有父类的可继承(非private修饰的)成员变量和方法
  • 提高代码的复用性 

(4)this和super

  • this:区分本类中的成员变量和局部变量同名的情况
  • super:区分子类中的成员变量和父类中的成员变量

(5)继承内存图

3、继承的特点和注意事项

(1)继承的特点:

  • Java只支持单继承:就一个子类  只能有一个父类(一个孩子只能有一个亲爹)
  • Java支持多层继承:一个子类有它自己的父类,这个父类还可以有它自己的父类
  • 父类定义了继承树中共性内容,子类定义了该类个性内容,子类拥有父类所有可继承的属性和方法(非private)
  • 说明:在以后的开发过程中我们学习了多态后,要结合多态,能使用父类时尽量使用父类,提高程序扩展性

(2)继承注意事项:

  • 继承必须合理性 =》人是人他妈生的 妖是妖他妈生的  从类与类之间的设计关系来看,子类必须属于父类的一种时 is a,才会继承
  • 父类中成员是共性的内容 =》所有子类都有的才能写到父类  父类抽取出了共性的内容,子类可以在父类基础上扩展新的属性与行为
  • 子类自动拥有父类的成员并且可以直接使用非私有的父类成员

4、Java为什么只支持单继承

5、向上抽取原则

Java中的设计思想:

  • 算法
  • 设计模式
  • 设计原则

Java的一个设计原则 - 向上抽取原则  =》把子类中共有的成员向上抽取出一个父类,把这些共有的成员写在父类中

下面是关于向上抽取原则的一道面试题:

题目描述:

请你设计四个类,花、树、猫、狗

解决如下:

6、方法重写

(1)什么是方法重写 

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

 1 class Fu
 2 {
 3     public void show()
 4     {
 5         System.out.println("Fu show");
 6     }
 7 }
 8 
 9 class Zi extends Fu
10 {
11     // 子类重写了父类的show方法
12     public void show()
13     {
14         System.out.println("Zi show");
15     }
16 }

(2)方法重写的应用

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,

这样,即沿袭了父类的功能,又定义了子类特有的内容

举例:比如手机,当描述一个手机时,它具有发短信,打电话,显示来电号码功能,后期由于手机需要在来电显示功能

中增加显示姓名和头像,这时可以重新定义一个类描述智能手机,并继承原有描述手机的类。并在新定义的类中覆盖

来电显示功能,在其中增加显示姓名和头像功能。

代码:

 1 public class Test {
 2     public static void main(String[] args) {
 3         new NewPhone().showNum();
 4     }
 5 }
 6 
 7 //手机类
 8 class Phone{
 9     public void sendMessage(){
10         System.out.println("发短信");
11     }
12     public void call(){
13         System.out.println("打电话");
14     }
15     public void showNum(){
16         System.out.println("来电显示号码");
17     }
18 }
19 
20 //智能手机类
21 class NewPhone extends Phone{
22     
23     //覆盖父类的来电显示号码功能,并增加自己的显示姓名和图片功能
24     public void showNum(){
25         //调用父类已经存在的功能使用super
26         super.showNum();
27         //增加自己特有显示姓名和图片功能
28         System.out.println("显示来电姓名");
29         System.out.println("显示头像");
30     }
31 }

(3)方法重写的注意实现

  • 子类方法覆盖/重写/覆写(override)父类方法,必须要保证权限大于等于父类权限
  • 如果父类的方法是private的修饰的,那么在子类中没法重写(其他修饰符都可以重写)
  • 写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样

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

原文地址:https://www.cnblogs.com/wyb666/p/10287934.html