一、面向对象基于面向过程
- 什么是面向过程
- 强调的是过程, 通过第一步, 第二步, 一步步自己完成对应的需求.
- 什么是面向对象
- 强调的是对象, 对象当中有具体的方法, 帮我们完成对应的功能.
- 面向对象的思想特点
- 面向对象是一种更符合我们思考问题的一种习惯(懒人思想)
- 将复杂的问题简单化
- 我们从执行者的位置变成了指挥者
二、什么是类,什么是对象
- 类
- java当中描述现实生活中事物都是通过类的形式.
- 属性 就是事物的描述信息
- 行为 就是事物能够做什么
- 对象
- 就是该类事物的具体体现
- 怎么理解
- 类仅仅是对事物的一种描述, 可以把类看做为一个模子,或者说是一张图纸
对象则是具体存在的事物
- 类仅仅是对事物的一种描述, 可以把类看做为一个模子,或者说是一张图纸
三、类和事物对应的关系
事物 -------类
事物的属性 -------类的成员变量
事物的行为 -------类的成员方法
成员变量和成员方法怎么在类中定义呢?
成员变量: 跟之前定义变量的格式是一样的, 只不过位置发生了改变,在类中方外.
成员方法: 跟之前定义方法的格式也是一样的, 只不过去掉了static关键字
四、成员变量和局部变量的区别
- 在类中的位置不同
- 成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)
- 成员变量:类中,方法外
- 在内存中的位置不同
- 成员变量:所属于对象,堆内存中
局部变量:所属于方法,栈内存中
- 成员变量:所属于对象,堆内存中
- 生命周期不同
- 成员变量:随着对象的创建而存在, 随着对象的消失而消失
局部变量:随着方法的调用而存在, 随着方法的弹栈而消失.
- 成员变量:随着对象的创建而存在, 随着对象的消失而消失
- 初始化值的问题
- 成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使用
- 成员变量:有默认值
- 作用域不同
- 成员变量: 作用域在整个类当中
局部变量: 只在它所在的那对儿大括号中有效
- 成员变量: 作用域在整个类当中
五、面向对象三大特征
1、封装
隐藏实现细节, 仅对外暴露公共的访问方式.
原则: 将不需要对外提供的内容都隐藏起来
好处:
提高了代码的安全性
提高了代码的复用性
private 可以看成是封装的一种体现
private关键字 也是权限修饰符
可以修饰的是成员(成员变量 成员方法)
被其修饰的成员只能在本类中进行访问.
2、继承
- 继承让类与类产生关系,但是继承要符合现实规律
- 继承的优缺点:
- 优点:提高代码复用性,可维护性,把子类的共性属性和行为放在父类中,所有儿子自动拥有,不用在重复定义
- 缺点: 写代码 要遵循 低耦合高内聚
耦合:依赖别人的能力
内聚:自己功能的能力
依赖父类的能力变强: 父类一旦缺失某些属性和功能,子类不能再用
自己的能力变弱: 我们把子类中一些功能和属性已经抽取到了父类中,子类直接拿过来用,不用自己定义
- java中类继承的特点
- 类与类属于单继承,但是可以多层继承 A extends B B extends C
- 继承中成员访问特点:
- 成员变量访问:遵循就近原则,以 局部-->本类成员--->父类非私有成员
- 成员方法访问:遵循就近原则以 本类方法--->父类非私有方法---....->Object非私有成员
- this与super
- 子类的构造下第一行代码 是super()调用父类的构造方法
解释:子类初始化时候可能用到父类的数据,如果父类没有先初始化,子类就不能用这些数据,所以在子类初始化前,先完成父类的初始化 - this
- 可以调用本类的成员(成员变量/成员方法)
哪个对象调用该成员方法,该成员方法中的this就代表这个对象 -
this(参数)用来调用子类的构造方法
语句必须放在构造方法第一行
举例 : class Demo extends Demo2 { int a = 10; public Demo() { System.out.println("Demo构造方法无参"); } public Demo(int a2) { this(); System.out.println("Demo构造方法有参"); } } * 成员变量 * this.成员变量名 * super.成员变量名 * 成员方法 * this.方法名(...) * super.方法名(...) * 构造方法 : 构造方法中使用 * this(...) * super(...)
-
super
-
可以调用父类的非私有成员(成员变量/成员方法)
-
super(参数);用来调用父类的构造方法,语句必须放在构造方法第一行
-
如果第一行没有写super(实参)或this(实参)那么构造方法第一行一定有一个super();
-
- 可以调用本类的成员(成员变量/成员方法)
- 子类的构造下第一行代码 是super()调用父类的构造方法
- 方法重写
- .应用场景:当父类原有的功能不能完全满足我们需求,我们就考虑重写父类的功能,并且基于父类原有的功能提供更强的功能
- 注意事项 :
- 子类和父类的方法名,形参列表,返回值类型必须完全一致
- 子类的方法的权限必须大于等于父类的方法的权限(不包含private)
public > protected > 默认权限(什么也不写) > private - 当子类的方法与父类的方法完全相同(方法名,形参列表,返回值类型全部相同),当创建子类对象 调用相同的方法,也是用的儿子的
3、多态
- 什么是多态 : 一个事物所具有的多种形态
- 多态的前提
- 继承
- 方法的重写
- 父类的引用指向子类的对象
- 多态中成员访问特点:
- 成员变量
- 编译时会检查父类中是否有该变量,如果没有,编译直接报错
如果有,此时编译通过
运行时,会执行父类的成员变量(编译看左边(父类 ) 运行看左边(父类)) - 成员方法
- 编译时会检查父类中是否有该成员方法,如果没有,编译直接报错
如果有,此时编译通过
运行时,会执行子类的的成员方法
- 编译时会检查父类中是否有该成员方法,如果没有,编译直接报错
- 了解 :
- 静态成员:无论编译还是运行只看左边 ,(静态属于父类,没有从写这一说)
- 方法有从写 所以编译看左边 运行看右边
- 优点 : 多态提高了代码的复用性和扩展性
- 缺点 : 不能直接访问子类特有功能,需要向下转型
- 多态的向上转型与向下转型
- 向上转型 把子类赋值给父类类型
- 向下转型 向下转型
- 向下转型需要强转
//eg: public static void main(String[] args) { Dog d =new Dog(); boolean result= d instanceof Dog;//d指向的对象是不是Dog的实例 System.out.println(result); Animal a=new Dog(); boolean result2= a instanceof Dog;//a指向的对象是不是Dog的实例 System.out.println(result2); Animal c=new Cat(); boolean result3= c instanceof Dog;//a指向的对象是不是Dog的实例 System.out.println(result3); }
六、this关键字
- this代表当前对象的引用, 谁来调用我, 我就代表谁.当前对象的引用
- 作用 : 用于区分局部变量和成员变量的重名问题.
- 如果局部变量和成员变量出现了同名的时候. java采用的就近原则
七、构造方法
- 构造方法注意事项
- 如果一个类中没有给出任何构造方法, 那么系统将会提供一个空参数的构造方法给我们使用
- 如果手动给出了构造方法, 那么系统将不会再提供那个默认的空参构造了
- 构造方法是系统帮我我们调用的,不能手动调用
- 构造方法能够重载
- 用来给对象中的属性进行初始化.
- 给成员变量的两种初始化方式有什么区别?
- 有参构造
- 无参构造 + setXxx()/getXxx()