一、final关键字

有的时候不想别人重写我的方法,使用final关键字修饰该方法,final:最后的,最终的,可以修饰类、修饰函数、修饰变量,修饰类:该类不能被继承;直接写在class关键字前面

修饰函数:函数不能被重写;直接写在函数返回值类型前面;

修饰变量:变量的值不能被修改,可以成为常量;直接写在变量的数据类型前面;

因为被final修饰的变量的值不能改变,所以被fianl修饰的变量有叫做常量;

此时,我们给他的命名的书写规范:全部字母都要大写;多个单词,可以使用下划线(_)分开;

如:       private static final double PI = 3.14;

变量的值不能改变,指的是直接保存在变量中的内容不能改变;

如果被final修饰的变量是一个引用类型的数据,那么通过这个引用改变堆空间中的数据,不会报错;

二、抽象类

1. 抽象类的产生

需求:创建类描述猫和狗的行为;

猫的行为:抓老鼠;吃鱼;

狗的行为:看家;吃骨头;

分析:

因为猫和狗都是动物,所以可以让猫和狗分别继承动物类,然后将共同东西抽取到动物类中;

小结:当事物的功能描述不清,只能表示有这个功能时,就应该使用抽象修饰该功能,这个功能就是抽象的功能;

如果一个类中有抽象的功能,那么这个类也是抽象的类;

2. 抽象的特点

a. 抽象类不能实例化

因为抽象类,表示一个描述不清的事物,所以不能实例化;

b.子类继承抽象类,必须实现父类的所有抽象函数,否则子类也是抽象的

抽象类,必须由子类去继承,继承的子类必须实现父类中所有的抽象方法;

c. 抽象函数必须放在抽象类中

因为类中有抽象函数,表示描述不清的功能,所以整个类所描述的事物,也是描述不清的,所以需要将类也定义为抽象的;

c. 注意事项

c.1 抽象类一定是父类吗?

是,因为抽象类就是通过不同的子类向上抽取共性信息得倒的,抽线类必须由子类去继承和重写抽象函数;

c.2  抽象类中有构造方法吗?

必须有,因为抽象类需要由子类去继承,子类实例化的时候,要调用父类的构造函数,抽象类的构造函数作用是初始化本类中的成员变量的;

c.3  抽象类中可以不书写抽象方法吗?

可以;可以只有非抽象的成员;

同样,不能实例化;

c.4 抽象类中可以定义非抽象的方法吗?(抽象类中可以书写普通方法和成员变量)

抽象类中除了抽象函数,还可以定义所有一般类中可以定义的成员;

c.5 抽象关键字abstract不能和哪些修饰符关键字共存?

因为抽象的函数只有被继承的子类重写了,才可以使用,所以不能和private以及final关键字一起使用;

static:   因为静态的函数可以直接使用类名调用,所以也不能使用static修饰抽象函数;

c.6 抽象类什么时候使用?

当描述的功能不确定,不知道具体怎么实现的时候,就需要使用抽象函数,这是类也是抽象的;

不想实例化这个类(包括自己也不行),但是允许别人继承,也可以使用抽象类;

3. 抽象类应用

需求:描述Hr和程序员:

有共同的

三、多态

1. 多态的引入

狗;哈士奇;二哈;动物;生物;汪星人;畜生……

生活中的一个实实在在的事物,我们可以使用不同的状态去描述,这就是多态;

而且我们在生活中,我们更习惯使用抽象的、一般化的概念来描述一个具体的事物;

酒:       啤酒;白酒;黄酒;红酒……

饭:       米饭;面条;饺子;包子……

使用一般化、抽象化的概念指代一个具体的事物,就是多态在生活中的体现;

2. JAVA中的多态

上面代码中红框部分使用了多态,结论:在java中,多态,指的是父类型引用指向子类实例对象;(接口类型引用指向实现类对象)

a. 多态的使用前提

生活中的前提:被指代的事物确实 是 用于描述它的那个概念 的一个特例;

Java中的前提:必须是继承关系(或者接口实现关系);

b.  多态的好处

生活中:使用多态指代事物,能够指代的范围更广泛,到了实际操作的时候,就有更多的选择;

Java中的好处:

描述猫和狗的行为,同时需要提供测试方法;

首先描述和测试猫

接下来描述和测试狗的行为

问题:每添加一个被测试的类型的对象,都需要单独创建一个专门的功能,而且在这些测试功能中,实现是类似的;

问题就是,代码复用性差,程序扩展性差;

解决:考虑使用多态,直接创建一个测试父类型的方法,然后就可以接受不同类型的对象;

1 /*

2 描述猫和狗的行为,同时需要提供测试方法;3 */

4 //描述动物

5 abstract classAnimal6 {7 abstract voideat();8 abstract voidsleep();9 }10

11

12 //描述猫的行为

13 class Cat extendsAnimal14 {15 //吃

16 voideat(){17 System.out.println("吃鱼");18 }19 //睡觉

20 voidsleep(){21 System.out.println("猫咪睡着了");22 }23 }24 //描述狗的行为

25 class Dog extendsAnimal26 {27 //吃

28 voideat(){29 System.out.println("吃骨头");30 }31 //睡觉

32 voidsleep(){33 System.out.println("狗狗睡着了");34 }35 }36 //创建测试类测试

37 classTest238 {39 //测试动物的行为

40 public static voidtestAnimal(Animal animal){41 animal.eat();42 animal.sleep();43 }44

45 public static voidmain(String[] args)46 {47 //使用多态指向猫的对象

48 Animal cat = newCat();49 testAnimal(cat);50

51 //使用多态指向狗的对象

52 Animal dog = newDog();53 testAnimal(dog);54 }55 }

小结:使用多态,可以提高程序的扩展性,降低代码的冗余;

c. 多态的弊端

使用父类型引用指向子类对象,不能通过父类性引用访问子类特有属性和行为;

3. 多态的类型转换

a. 多态的类型转换

自动向上转型: 将子类性对象赋值给父类型引用,可以自动进行;提升了子类对象的类型;

强制向下转型:将父类型引用转为子类性引用,降低了引用的类型,需要强制转换;

结论:是用强制向下转型,可以解决多态使用的弊端;

b. 强制向下转型的问题

c. instanceof 关键字

instanceof:   比较运算符;

运算符左边是一个指向一个对象的引用(左边就是一个变量名),右边是一个类名,运算符表示的意思就是:判断左边的对象的类型是不是右边的类;

结论:使用instanceof关键字,可以实时判断一个对象的类型,就可以避免强制类型转换中容易出现的类型转换异常;

d. 多态中成员的特点

程序分为编译和运行两个阶段,程序中的成员,又分为静态和非静态两种,所以,要分不同情况讨论;

在使用多态的程序中,编译时,不管是什么成员,编译器都看的是父类型的引用;

运行时,所有成员变量都是用的是父类型的;静态函数使用的是父类型的,非静态函数使用的是子类重写的;

总结:在使用多态时,成员的特点:

编译期:不管什么成员,只要用到了,都要检查父类中有没有;

运行期:所有成员变量和静态函数都是使用的父类的,非静态函数使用的是子类重写的;

静态成员不参与多态,只有非静态成员才与多态,因为多态是和对象有关的;

编译时都要看 等号  左边;

运行时,只有非静态函数看等号右边;

f.多态练习

1 /*

2 需求:描述老板让Hr、程序员干活;3 */

4 //描述Hr

5 classHr6 {7 voidwork(){8 System.out.println("人事管理");9 }10 }11

12 //描述程序员

13 classProgrammer14 {15 voidwork(){16 System.out.println("敲代码改变世界!");17 }18 }19 //描述老板

20 classBoss21 {22 //老板让Hr干活

23 voidletHrWork(Hr hr){24 hr.work();25 }26

27 //老板让程序员干活

28 voidletProWork(Programmer pro){29 pro.work();30 }31 }32

33 classTest534 {35 public static voidmain(String[] args)36 {37 Boss boss = newBoss();38

39 Hr hr = newHr();40 boss.letHrWork(hr);41

42 Programmer pro = newProgrammer();43 boss.letProWork(pro);44 }45 }

传统的做法,太麻烦,需要一个一个去做;

而实际生活中不是这样,老板一个命令,所有干活的都要去工作,所以考虑从使用多态

1 //描述打工的

2 abstract classWorker3 {4 abstract voidwork();5 }6 //描述Hr

7 class Hr extendsWorker8 {9 voidwork(){10 System.out.println("人事管理");11 }12 }13 //描述程序员

14 class Programmer extendsWorker15 {16 voidwork(){17 System.out.println("敲代码改变世界!");18 }19 }20 //描述老板

21 classBoss22 {23 voidletWorkerWork(Worker worker){24 worker.work();25 }26 }27

28 classTest629 {30 public static voidmain(String[] args)31 {32 Boss boss = newBoss();33

34 Worker hr = newHr();35 boss.letWorkerWork(hr);36

37 Worker pro = newProgrammer();38 boss.letWorkerWork(pro);39 }40 }

多态总结:

概念:一种事物可以有多种表示形态;而且一般习惯使用更抽象、更一般化的形态表示这个事物;

多态在Java中的体现:父类型引用指向子类实例对象;接口引用指向实现类对象;

多态的前提:必须有继承或者接口实现的关系;

多态的好处:提高代码的复用性,提高程序的扩展性;

多态的弊端:不能使用子类对象特有的属性和功能;

解决多态弊端的方法:使用强制类型转换;

使用强制类型转换容易出现类型转换异常,解决的办法是转换前使用比较运算符:instanceof判断;

多态使用中成员的特点:

编译时,所有成员都看父类;

运行时,只有非静态成员函数看子类;

静态成员不参与多态;

四、接口

1. 接口的引用

需求:分别描述以下三种动物的行为:

狗:吃;叫;

猫:吃;叫;

猪:吃;叫;

接下来,需求升级:

狗和猫经过训练,都学会了表演;

2. 接口代码体现

a. 接口的声明格式

接口使用关键字:interface声明;

b. 接口中能书写的成员

接口和类不同,在接口中可以书写的内容,都已经被Java固定了:

成员变量:    只能使用一下修饰符:public static final;

也就是说,接口中的成员变量,都是常量;

成员函数:    只能使用修饰符:public abstract ;

也就是说,接口中的方法,都是公共和抽象的;

这些修饰符,是Java在语法层面固定的,我们可以省略不写,编译器会帮我们加上;

要写,就只能这么写,不能改写;

c. 接口的实现

接口和抽象类一样,都无法实例化,需要使用一个类来实现接口,使用关键字:implements

d. 多态使用接口

一般开发中,都会通过多态的方式使用接口;

接口类型的引用指向实现类的对象;

3. 接口的多实现 & 多继承

接口的多实现

小结:一个类可以实现多个接口,多个接口之间使用逗号分开;

如果一个类实现了接口,就必须实现接口中的所有方法,否则这个类应该定义为抽象的;

当使用其中一个接口来利用多态的形式使用实现类的对象时,只能访问属于这个接口的属性和方法;

接口的多继承

接口和类之间是实现的关系,接口和接口之间是继承的关系;而且接口支持多继承;

4. 接口的使用思想

a. 作用总结:

a.1、接口可以描述事物不属于继承体系中的扩展的功能;

a.2、通过多态的方式使用接口,可以提高程序的扩展性;

a.3、接口实现了java中的多继承;

b. 使用接口定义规则

规则,就是规范,是一种约定;

五、接口和抽象类的区别

1. 接口和抽象类的区别

a. 从声明上:

抽象类是一个类,使用class声明;还需要使用关键字abstract修饰;

接口不是一个类,使用interface声明;

b. 从能够书写的成员上看:

抽象类是一个类,可以书写类中可以书写的成员,和抽象函数;

接口只能书写成员变量和抽象函数,而且修饰符是固定的;

c.从有无构造函数上看:

抽象类必须有构造函数;

接口没有构造函数

d.从作用上看:

抽象类是父类,用来描述所有子类的共性信息的,只是描述的有些功能是不具体的;

接口是用来描述不属于继承体系的扩展功能的;还可以定义规则;

e.继承关系上:

抽象类和类之间是继承关系,只支持单继承和多重继承;

接口和类之间是实现关系,一个实现类可以实现多个接口;

接口和接口之间是继承关系,可以多继承和多重继承;

2.接口和抽象类的使用练习

需求:描述手机和电脑,都有开机、关机和可以玩游戏的功能;

1 //表示可以玩游戏的接口

2 interfacePlayGame3 {4 //表示具有玩游戏的功能

5 public voidpalyGame();6 }7 //表示电子产品

8 abstract classElecPro9 {10 //所有的电子产品都可以开机关机,不同的电子产品开关机的实现不同11 //所以要是抽象的

12 public abstract voidopen();13 public abstract voidclose();14 }15 //描述手机

16 class Phone extends ElecPro implementsPlayGame17 {18 public voidopen(){19 System.out.println("手机开机");20 }21 public voidclose(){22 System.out.println("手机关机");23 }24 public voidpalyGame(){25 System.out.println("手机玩游戏");26 }27 }28 //描述电脑

29 class Computer extends ElecPro implementsPlayGame30 {31 public voidopen(){32 System.out.println("电脑开机");33 }34 public voidclose(){35 System.out.println("电脑关机");36 }37 public voidpalyGame(){38 System.out.println("电脑玩游戏");39 }40 }

c面向对象 java_JAVA基础--面向对象08相关推荐

  1. polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  2. java基础面向对象_Java基础面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该 ...

  3. java基础面向对象_Java基础-面向对象

    一面向对象基础 1 类:例如车有:小汽车.大卡车.三轮车.四驱车等等.但要用一个词概括它们,则可以统称为车.现在这个"车"就相当于 类 2 抽象类:一个被 abstract 修饰的 ...

  4. python登录面向对象_python基础 面向对象一

    面向对象三大特性 封装 继承 多态 多个不同的类具有共同的方法f,各个类调用方法f,返回值不同.把方法f提取出来,封装为一个接口g.不同类的实例作为参数,传入接口g,得到不同返回值. classDog ...

  5. 笔记整理2----Java语言基础(二)06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础

    06 断点调试与数据加密+07 面向对象-类与对象+08 java常用API-基础+09 java集合+10 IO流-基础 第06天 java基础语法 今日内容介绍  Eclipse断点调试  基 ...

  6. java基础面向对象总结

    面向对象 面向对象的思想概述 程序员从面向过程的执行者转化成了面向对象的指挥者 面向对象分析方法分析问题的思路和步骤: 1.根据问题需要,选择问题所针对的现实世界中的实体. 2.从实体中寻找解决问题相 ...

  7. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  9. matlab面向对象排序,matlab面向对象编程基础

    matlab面向对象编程基础 觉得有用的话,欢迎一起讨论相互学习~ Matlab面向对象大体结构 类定义的普通模板 代码清单2.1.1 classdef className properties pr ...

最新文章

  1. windows计算器
  2. SQL函数---SQL HAVING 子句
  3. Shell中的数据重定向--输入/输出重定向
  4. 巧用Graphviz和pvtrace等工具可视化C函数调用
  5. 2高并发服务器:多线程服务器
  6. hive的udf,udaf,udtf各自依賴兩種class(转载+分析整理)
  7. c语言奇葩错误,6个奇葩的(hello,world)C语言版(转)
  8. MVC中使用代码创建数据库(code first +mysql+EF)
  9. 娄底八中的初中计算机考试,众人同心勤耕耘 敢叫日月换新天
  10. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
  11. 采用FTP协议实现文件的上传
  12. R语言机器学习:xgboost的使用及其模型解释
  13. 笔试算法题(17):奇偶数分置数组前后段 反序访问链表
  14. 信号与系统公式大全(傅里叶变换、拉普拉斯变换、Z变换、卷积...)
  15. 强化学习之Q-learning简介
  16. ubuntu搜狗拼音输入法无法切换英文
  17. jquery name选择器
  18. Intel VT学习笔记(八)—— 开启EPT
  19. 常用的curl命令及参数详解
  20. 鹅肉是凉性还是热性 鹅肉怎么做好吃

热门文章

  1. linux 反弹 socket,反弹shell基础
  2. 深入了解OWIN Katana
  3. 尤雨溪介绍 Vue 3:语法不变、TS 支持很好、2.0 系列还会发一个版本
  4. 学习Azure Functions:在Visual Studio 2017中创建Azure Functions
  5. Odoo10教程 -- 主题教程
  6. 科学计算机的用途,计算机最主要的用途之一就是科学计算,科学计算可分为两类...
  7. cubemx stm32 配置两个串口_STM32CubeMX系列教程5:串行通信(USART)
  8. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
  9. 红帽7编译安装mysql_精通RHEL7编译安装mysql-5.5.32
  10. mysql哨兵机制_Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了