Java面向对象
面向对象
面向对象是一种编程思想
面向对象的特点
1、面向对象是一种常见的思想,是符合人们思考习惯的;
2、面向对象可以将复杂的问题简单化;
3、让原来过程中的执行者,变成了对象中的指挥者;
Java中认为任何一个事物都是对象;
类和对象的关系
类是对现实中的事物的描述;
类是怎么样描述事物的?
1、属性 2、行为;
类的成员:
1、成员变量 2、成员方法;
对象是通过类创建的 实实在在 存在的 个体实例;
对象可以封装特有的数据;
举例: 一辆汽车具备轮胎数、颜色……
学生对象封装了 姓名 年龄 身高等数据;
通过new关键字 来创建一个对象;
通过 对象.成员 的方式,可以调用该对象的属性及方法;
成员变量和局部变量的区别
作用域不同
1、成员变量定义在类中,整个类都可以访问;
局部变量定义在方法、语句、局部代码块中,只有所属区域可以访问;
存储位置不同
2、成员变量存储于堆内存中;
局部变量存储于栈内存中;
生命周期不同
3、成员变量 随着对象的创建而创建 ,对象的消失而消失;
局部变量 随着所属区域的执行而创建 ,执行结束而消失;
初始化不同
4、成员变量 有 默认初始值;
局部变量 没有默认初始值;
属性的显示初始化:
对成员变量赋一个,默认的,习惯性的初始值;
匿名对象 没有名字的对象;
什么时候使用匿名对象:其实就是创建对象的简写形式,当只对对象的方法进行一次调用时,可以简化成匿名对象;
特点: 1、匿名对象一旦被创建,就已经是垃圾内存;
2、如果匿名对象被作为参数进行传递,则不会被立刻变成垃圾内存,因为方法的引用会指向该内存;
封装
即:封闭 包装
定义:隐藏对象的实现细节,对外提供了访问方式;
特点 1、提高了代码的安全性 2、便于使用 3、将变化隔离 4、提高了代码的复用性;
Java bean (咖啡豆)- 就是一个普通的Java类,但是一个Java类如果想成为一个bean的话,必须符合三个条件:
1、所有属性私有;-》保护属性值不被破坏;
2、提供属性的公有的get和set方法;-》可以给属性添加约束条件,或者限定不同权限的用户是否可以获取到属性的值;
3、必须提供无参的构造方法;-》Java bean多是用在框架中,框架需要使用bean的无参构造方法生成对象;
建议所有的类都要写成bean的形式;
Function - 函数
Method - 方法
构造方法(构造器):
1、方法名必须和类名一致;
2、没有返回值类型,任何返回值类型都不能写;
3、构造方法中一定不能用return来返回一个值;
4、可以有参数,也可以没有参数;
5、一般情况下,构造方法是公有的;
构造方法的作用是用来生成对象的,换句话说,一个类如果想要被实例化(生成对象),那么必须要有构造方法;
如果没有给类定义任何构造方法,那么JVM会自动的为这个类分配一个无参的空构造方法;
如果已经定义了任何的构造方法,则JVM不会再自动分配无参的空构造方法;
当我们的对象中有属性需要初始化的时候,使用构造方法是最好的选择;
继承
发生在两个类之间,被继承的类叫做父类(基类,双亲类,超类),继承类叫做子类(派生类);
在Java中,使用extends关键字实现继承;
1、继承关系一旦确立,子类就继承了父类所有的属性和方法,但是不包括私有成员和构造方法;
2、有继承关系的类,如果实例化子类的对象,首先会生成其父类的对象,然后再生成子类的对象;
3、在生成父类对象时,默认是调用父类的无参构造方法来创建对象的,如父类没有无参的构造方法,则程序会出现编译错误;
这时候,子类中必须显式的调用父类的某一个有参构造方法来构造父类;
super关键字的用法:
代表的是父类对象;
1、子类中任何方法中(成员、构造)都可以用super.属性名,或者 super.方法(参数列表)来引用父类对象的属性和方法;
2、super(参数列表)- 调用父类的某个构造方法,必须用在子类的构造方法中,并且必须是构造方法中的第一句话;
继承的作用
1、继承可以扩展父类的属性和方法;
2、继承也是代码实现复用性的一个重要的手段;
严禁代码的拷贝 - 不能出现冗余代码(相同代码)- 代码的坏味道; -》 代码的复用性;
什么样的两个类之间有继承关系?
初步判定:A和B两个类,如果满足 A is a king of B ,则认为A和B有继承关系;
科学判定:里氏替换原则 - A和B两个类,只有A类能够完成替代B类所有特征和行为的时候,A和B才有继承关系;
换句话说,如果A继承B,继承关系确定,子类对象可以完全替代父类对象;
根据里氏替换原则 B b = new A(); - 父类引用指向子类对象;- 多态 的 基础 ;
多态
- 解耦合 - 开闭原则 -> 对扩展开放,对修改关闭;目标:高内聚 低耦合
耦合的缺点:
1、灵活性差 2、可维护性差 3、可扩展性差
什么是多态
字面意义 - 一个事物的多种形态;
编码角度 - 一个方法的多种实现;
设计理念 - 将做什么和怎么做分开;
如何实现多态
1、必须有泛化(继承、实现)关系; 2、必须有方法的重写; 3、必须有父类(接口)引用指向子类(实现类)对象;
方法的重载和重写:
重载 - 方法名相同,参数列表不同(个数或类型不同)的方法,称之为重载;
重写 - 在子类中,有和父类中同方法名,同参数列表,同返回值类型的成员方法;称之为重写;
注:重写过程中,子类中方法的访问限制符必须大于等于父类中方法的访问限制符;
private < default < protected < public
当父类引用指向子类对象时:Father s = new Son();
调用的方法是谁的方法,取决于对象的类型,而不是引用的类型;
调用的属性是谁的属性,取决于引用的类型,而不是对象的类型;
在工作中,不建议在父类和子类中定义同名的属性;