类与对象第六节

面向对象与面向过程

一、(重点
1、什么是面向过程? ----看重过程的开发
C语言就是针对于面向过程。在开发一个程序的时候,看重的是每一个过程,每一个过程步骤都需要自己去做
2、什么是面向对象? ----看重类的设计
java 、c#、js…当开发一个程序的时候,不看重具体的过程,看重的是谁能帮我去完成这件事情,找 (对象)帮我去做。
****** ******前期去设计类的时候比较复杂,但是后期的复用性扩展性比较好
3、面向过程、面向对象的优缺点?
①面向过程优点是面向过程的性能比面向对象高,因为面向对象在实例化时,开销比较大。缺点是维护性、扩展性没有面向对象好
②面向对象的优点是维护性、扩展性好。缺点是性能低,开销大。

(例子)人把大象装进冰箱

面向过程:1》打开冰箱 2》把大象装进冰箱 3》关闭冰箱门
面向对象:
人{
———打开(冰箱){冰箱.打开();}
——— 操作(大象){大象.进入冰箱的方法();}
——— 关闭(冰箱){冰箱.关闭();}
}
冰箱{
——— 打开();
——— 关闭();
}
大象{
——— 进入冰箱的方法();
}
4、面向对象的三大特征
封装性,继承性,多态性

类和对象

1、类和对象之间的关系?
面向对象程序设计重点是类的设计,而不是对象的设计
类就像一个汽车图纸,抽象的、概念上的定义,而对象就是根据汽车图纸真正造出来的汽车,对象是类的实例,类的一个产物。
2、类(列如汽车设计图纸)
***属性 颜色、品牌、价格…
***行为 行驶、开关车门…
映射到Java类里面,也是由两部分构成
***成员变量(属性) 定义在类的下面方法之外
***成员方法(行为) 去掉static关键字,就是一个成员方法
3、一个类通常情况下是不能够直接使用的,就类似于汽车图纸,他是不能够直接行驶的,如果想用这个类,就必须根据这个类去创建一个真正的对象,就类似于根据汽车图纸去造一辆汽车。
4、怎么去创建一个对象呢?
类名 对象名= new 类名(); 对象名的命名规范与变量名一致
———类名是个数据类型(引用)
5、怎么去调用属性和行为呢?
对象名.属性名
如果谁能够没有赋值将会有一个默认值(他在堆里)
怎么使用方法?
对象名.方法名

成员变量与局部变量的区别(重要)

1、定义的位置不同
成员变量定义在类的内部方法之外
局部变量定义在方法内部
2、作用域不同
成员变量作用类内部
局部变量作用在方法之内
3、默认值不同
成员变量有默认值
局部变量没有默认值
4、内存中的位置不同
成员变量保存在堆里
局部变量保存在栈里
5、成员变量有四种访问修饰符
局部变量不能用访问修饰符,默认与方法的修饰符相同

面向对象的三大特征

一、封装性

当我创建完对象以后,我如果直接通过“对象名.属性名”的方式给属性赋值的话,可能会出现一些不符合实际情况的问题。
所以我们不考虑使用“对象名.属性名”的方式赋值,而是通过“对象名.方法名”的方式进行赋值,因为我可以在方法里面加上大量的业务逻辑,对属性值进行限制。

解决方法:(怎么去用封装呢)
1、将属性私有化。private
2、提供公有的(get和set)方法实现属性的取值和赋值。

构造方法 new的就是一个构造方法
在我们创建对象的时候,会用见一个特殊的方法叫做构造方法(构造器)

怎么去创建一个构造方法呢?
public 构造方法名(形参){}
注意:
构造方法没有返回值。
构造方法名必须和你当前类的名字一致,包括大小写

构造方法是一个方法,它可以用于方法重载吗?
可以

作用:
1、创建对象,new的时候就是调用了构造方法。
2、在创建对象的同时,我们可以调用有参的构造方法,直接对属性赋值。

set 方法与构造方法赋值
针对多个属性同时赋值,建议用构造方法
set针对于单个变量进行更改

二、继承性

什么是继承?
子类继承父类,允许子类拥有父类的属性和行为。
优点:
提高了代码的复用性。
缺点:
由于继承会有多层的继承关系,会提高他们之间的依赖关系,耦合度会变高。
语法:
class 子类 extends 父类
1、使用继承以后父类所有的属性(除了私有的)和方法子类都可以获取到
2、子类除了通过继承父类的属性和方法外,还可以单独定义自己独有的属性和方法
3、一个子类还可以派生别的子类吗? 可以的
4、一个父类可以有多个子类,一个子类可以有多个父类吗? 不可以
java的继承是单继承:一个子类只能有一个父类,一个父类可以有多个子类。

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
一、局部变量和成员变量重名时 ,方法会遵循“就近原则”,谁离得近就用谁的值。
如果想区分同名成员变量和局部变量,可以使用this关键字。
格式
this.成员变量
什么是this?
1、this代表当前使用的对象或者是正在创建的对象,谁通过那个对象调用了方法,谁就是this。
2、this可以修饰成员变量、方法、构造方法。直接在成员变量名或者成员方法名前面加上this
3、可以在构造方法中通过“this(形参)”的方式调用本类其他构造方法。
注意:在构造方法内部this(“形参”)必须放在首行。
如果一个类里面有N个构造方法,那么最多有n-1个构造方法内部使用了this()。
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
二、super
super关键字可以修饰属性、方法、构造方法。
1、当前子类和父类的属性出现重名时,默认会调用子类的属性,可以通过
“super.属性名”的方式显示的调用父类声明的同名属性。
2、子类重写父类方法后,如果子类想再次调用父类被重写的方法,可以通过
“super.方法名”的方法调用父类方法
3、super可以修改构造方法,通过子类“super(形参)”来显示的调用父类对应的构造方法。
注意:super(形参)必须声明在首行
----说明this(形参) ---- super(形参)只能出现一个
----在构造方法中,不显示的通过super(形参)的方式调用父类对应的构造方法。
----默认会调用父类无参的构造方
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
三、final
final 关键字:代表最终的意思
可以修饰:类、方法、成员变量、局部变量。
修饰类,这个类不能被继承(最终的)这个类可以继承别的类。
修饰方法,这个方法是最终的一个方法,不能被重写
修饰成员变量:
1、成员变量不会再有默认值
2、必须直接对成员变量进行赋值
修饰局部变量:局部变量的值不会更改,一般修饰常量,只可赋值一次
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
四、static
static:静态的
一、修饰成员变量 (类本身)
①、这个变量就不属于对象,而属于类本身,谁通过这个类去创建对象,这些对象公用这个属性。
②、当其中一个对象对类变量进行更改,其他对象的这个类变量也会改变
二、与实例变量(非static变量,属于对象本身,每个对象都各有一套副本)的区别:
1、类变量是随着类的加载而加载
2、类变量是放在方法区的静态域里面,而不是堆
3、类变量的生命周期大于实例变量
三、修饰方法(类方法)
①、这个方法属于类本身,类方法,可以通过“类名.方法名”调用
②、随着类而加载
③、在静态方法里面只能用静态变量和静态方法,相反在普通方法里面可以调用静态方法和静态变量。因为静态变量和静态方法加载时机早于实例变量和实例方法。
④、不能用this和super关键字。
四、修饰代码块
代码块的作用:完成初始化
(1)非静态代码块:给类的属性进行初始化操作。也可以调用方法(静态、非静态都可)
(2)静态代码块
里面可以有输出语句;
随着类加载而加载,只会执行一次;
静态代码块的加载时机要早于非静态代码块;
静态代码块里面只能调用类变量和类方法;(加载时机不同)
作用:jdbc (接口)
对属性赋值:①默认初始化②显示的初始化③、set或者构造方法④代码块

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
访问修饰符
修饰类、变量、方法、接口。
public:公共的,在当前项目下任何地方都可以访问。
protected:受保护的,在同一个包下或者在其他子类中可以访问。
default:缺省,在同一个包下可以访问。
private:私有,仅在当前类下可以使用。+

三、多态性

什么是多态性?
(1)同一个动作与不同的对象产生不同的行为。
(2)多态指的是一个对象的多种形态。
多态的体现方式?
(1)使用继承:不同的子类重写父类方法后,体现出来的形式不一样。
(2)接口的实现(现了解,后讲)
形成多态的必要条件?
1、继承:存在子类与父类的关系
2、接口的实现:定义一个类实现对应的接口
3、重写 :子类重写了父类的方法
4、重载 :调用相同的方法名实现的功能不一样(与重写一起都在方法博客记录)
5、子类对象的多态性(重点)
—————————————————————————————————————
父类的引用指向子类的实例
Pet (宠物类 ) 在里 面定义一个info方法
Dog (狗类) 对info重写
狗类继承宠物类(继承是前提
Pet pet = new Dog;(向上转型)
pet.info;调用的是子类的info(子类对象的多态性)
Pet p先进栈,, new一个dog()会进堆,同时会加载子类与父类的属性和方法,会生成地址值指向给p,这时候通过p去调用info,是指向子类的地址值,调用的就是子类重写后的info方法。
**编译期间在堆里还没创建new Dog 程序会把pet对象看成是父类对象
(程序分为两种状态,一个是编译状态,一个是运行状态)
对于多态来说,编译时看左边 即看成Pet的对象,运行时看右边,看成Dog对象,真正执行的对象,是子类对象
强制类型转换
Dog子类,Pet父类,编译期间pet是父类对象,那我想在编译期间就把pet变成子类对象呢?
把大的变小得强转
Dog dog = (Dog)pet; // 向下转型
一、向上转型
将子类对象交给父类引用可以自动转换
二、向下转型
将父类交转成子类
instanceof运算符的作用
用于判断类型是否匹配" pet instanceof Dog "判断pet是否是Dog的实例
总结:对象的多态性
①、父类的引用指向子类的实例
②、编译看左边,运行看右边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值