内容:
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的修饰的,那么在子类中没法重写(其他修饰符都可以重写)
- 写法上稍微注意:必须一模一样:方法的返回值类型 方法名 参数列表都要一样
总结:当一个类是另一个类中的一种时,可以通过继承,来继承属性与功能。如果父类具备的功能内容需要子类特殊定义时,进行方法重写