目录
面向对象整理
面向过程和面向对象的区别
面向过程编程思想不考虑封装,继承,多态这些事情,直接定义数据为静态变量,用静态函数操作数据,基于过程编程。面向过程编程,代码不具有可复用性和可扩展性。
面向对象编程思想需要先抽象出实体的结构,并用类进行封装,用成员变量表达实体的属性,用成员方法封装对实体属性的操作。提供构造方法构造对象,基于对象编程。面向对象编程,代码具有可复用性和可扩展性。
举例:实现汽车租聘系统
面向过程的思想:
定义多个静态数组,存储汽车各项数据,直接定义静态数据实现各种业务过程
面向对象的思想:
先抽象出汽车实体的结构,并使用汽车类进行封装,然后创建汽车数组存储汽车实体的数据,再考虑业务功能的实现
面向对象的三大特征
1.封装
2.继承
3.多态
第一特性:封装
用成员变量来描述对象的属性,并用private进行私有化封装,不对外暴露对象的属性。防止外部对属性误操作
用成员方法来封装对属性的操作,并暴露给外部调用,典型的就是setter和getter,一个是提供给外部进行属性设置,一个是提供给外部读取属性的值
第二特性:继承
1.继承是Java中类与类之间的一种关系
2.继承的关键字是extends
3.发生继承的类称为子类,被继承的类称为父类
4.Java不支持多继承,只支持单继承,但支持多级继承。一个类只能一个继承父类,但是一个父类可以有多个子类
5.如果一个类没有显示当地继承父类,则隐式继承Object类
6.子类可以继承父类的非私有(非private修饰)成员
7.父类的构造方法子类不能继承,但可以使用super()调用
8.父类的静态成员与继承无关
9.如果父类中有抽象方法,子类必须要重写,除非子类也是抽象类,让子类的子类去重写(实现)
第三特性:多态
先有继承而后有多态,多态的反义词是单态
1.指针的多态(数组的多态,参数的多态,返回值的多态归根到底都是指针的多态)
如果指针是具体的子类类型,则指针是单态指针,只能指向具体的子类对象
如果指针是抽象的父类类型,则指针是多态指针,可以指向任意的子类对象
2.方法的多态(1.基于重载实现 2.基于重写实现)
重载是编译时多态的体现
重写是运行时多态的体现
重载和重写的区别
重载和重写都是方法多态的体现
重载overload是编译时多态的体现
1.重载发生在同一个类中,Java允许多个方法同名存在,但必须满足重载的要求
2.方法名相同,但是方法的参数列表不同(可以是参数个数不同,或者是参数类型不同)
3.静态方法,构造方法,成员方法都可以重载
重写(override)是运行时多态的体现
1.重写发生在子类与父类之间,子类重写父类的方法,其目的是:当使用父类型的指针调用子类方 法的时候,可以无需向下转型
2.子类方法与父类方法同名
3.访问修饰符要大于等于父类方法
4.参数的个数必须与父类一样,参数类型可以小于等于父类方法的参数类型
5.返回值类型可以小于等于父类方法的返回值类型
抽象类和抽象方法的关系
1.抽象类和抽象方法都需要使用abstract关键字修饰
2.抽象方法必须出现在抽象类中
3.抽象类中可以有抽象方法,也可以没有
普通类和抽象类的关系
普通类可以实例化
抽象类不可以实例化,只能被继承
实例化就是new构造方法()创建对象
向上转型和向下转型的区别
向上转型
1.将子类对象/指针赋给父类指针的语法称为"向上转型",隐式的
2.继承是向上转型的前提,向上转型的目的是为了实现多态的指针
3.向上转型的副作用:指针无法访问下级对象中的成员(除非发生了重写)
向下转型
1.将父类型指针赋给子类型指针的语法称为"向下转型",需要显式的强制转换,通常伴随着instanceof做类型判断,否则可能会出现ClassCastException(类型转换异常)
2.指针向下转型为子类类型,就可以访问子类中特有成员了(非重写的成员方法)
3.向下转型的条件:先向上转型,再向下转型。没有经过向上转型,会提示编译错误。
4.向下转型的作用:向上转型时 ,会遗失子类对象独有的其他方法;可以通过向下转型在重新转回。
访问权限修饰符
修饰符 | 当前类 | 同包 | 子类 | 其他包 | |
private | 私有的 | 可见√ | 不可见× | 不可见× | 不可见× |
(default) | 同包可见 | 可见√ | 可见√ | 不可见× | 不可见× |
protected | 受保护的 | 可见√ | 可见√ | 可见√ | 不可见× |
public | 公有的 | 可见√ | 可见√ | 可见√ | 可见√ |
private的特点:只有本类可见
(default)的特点:只有同包可见
protected的特点:子类可见
public的特点:任何地方都可见
抽象类和接口的区别
1.接口也是一种源代码文件
定义类的关键字是 Class
定义接口的关键字是interface
2.接口的出现让Java也能够实现多继承,一个类只能继承一个父类,但是可以继承多个接口
子类继承父类,关键字是extends
子类实现/实现/扩展接口,关键字是implements,
3.接口与抽象类进行比较
相同点:
1.都可以作为指针的类型,实现多态指针
2.都不可以实例化
不同点:
1.抽象类用abstract class定义,接口用interface定义
2.抽象类用extends继承,接口用implements实现
3.类只能单继承,接口可以多实现
4.虽然两者都不可以被实例化,但是抽象类可以有构造方法,接口不可以有构造方法
5.抽象类可以有抽象方法,也可以有具体方法,接口只能有抽象方法,而且接口中所有的方法默 认是"public abstract"修饰的
6.抽象类可以有成员变量,接口不能有成员变量,只能有静态常量
如何理解接口?如何理解面向接口编程
代码中存在依赖和调用关系,应该面向接口编程
调用方 - 被调用方
final饰符的作用
final表示最终
修饰变量,称为常量,值不可以修改
修饰方法,称为最终想法,方法不可以被子类重写
修饰类,称为最终类,类不可以被继承
abstract关键字是否可以与final同时出现
或者这么问能不能同时用abstract和final修饰类或者方法
答案是不能,原因是
1.abstract修饰的类称为抽象类,抽象类不能被实例化,只能被继承
2.abstract修饰的方法称为抽象方法,抽象方法必须让子类重写,而final是阻止子类重写
final修饰的变量真的不能改变吗
如果final修饰的变量是基本数据类型,指向常量池,那么值不可以修改
如果final修饰的变量是引用数据类型,指向堆,那么指针不可以修改,但是指针指向的对象内的成员可以修改