方法+面向对象
面向对象
面向对象编程
面向对象程序设计(OOP Object Oriented
Programming)是当前主流的程序设计架构,使我们编
程过程更符合人们的日常生活习惯
面向过程程序设计,简称opp,c语言就是面向过程的编程
语言
面向过程思维方式中更多的体现的是执行者(自己做
事情),面向对象中更多的体现是指挥者(指挥对象
做事情)
面向对象四步骤
1.创建一个类描述一类事物
1.1通过成员变量表示数据
1.2通过普通方法表示功能
2.根据类创建对象
定义引用=new构造方法
3.给对象属性赋值
对象.属性=值
4.调用对象的方法 解决问题
对象.方法名(实参);
方法重载:一个类中 几个方法 方法名相同形参列表不同的现象
一个方法只有返回值类型不同不构成重载
面向对象的三大特性
- 封装
之前学习的方法,就是将某个功能写成方法,编写类
的过程也是一种封装
提高了代码的复用性,便于调用者的使用,提高了安
全性 - 继承
- 多态
类和对象
-
类
对某一类有相同特征的事物的抽象,例如建造房子时设
计的模型 -
对象
表示现实中该类事物的个体,就是类的具体实现,例如
已经建造成的一个房子创建对象的格式 类名 对象名 = new 类名();
例如:Woman woman=new Woman ( ) ;
使用对象主要是想用对象当中的属性方法。
对象调用: 对象名.属性名/方法名 ( ) ;
-
属性
该类事物的共有的特征,实际就是我们之前所学习的变
量,只不过和之前学过的变量稍有区别调用成员变量格式: 对象名.成员变量 ,如果在当前类中非
静态方法中可以直接写成员变量名称 -
方法
该类事物共有的功能调用方法的格式: 对象名.方法名(具体的参数) ,如果在当
前类中,可以直接写方法名 -
新建一个类,写main方法
-
注意:我们程序的入口仍然是main,所以要想对成员变量
赋值,以及调用方法,需要在main中写具体的赋值和调用
的代码[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYTSMhpQ-1645093880609)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1644978822019.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgx2KZRW-1645093880614)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1644978853601.png)]
成员变量和局部变量的分别
-
定义的位置不同:成员变量定义在类中,局部变量定义在
方法中 -
内存中存储的位置不同:成员变量存储在堆中,局部变量
存储在栈中 -
生命周期不同:成员变量伴随这对象的存在而存在,局部
变量当方法出栈后就不能使用 -
初始化不同:成员变量会随着对象的创建进行默认初始
化,局部变量如果不初始化就不能使用
###构造方法
类中定义的用于构建创造对象的方法
特点: 1 没有返回值 不用void标识-
2 名字和类名必须相同
-
3 一个类 如果没有构造方法 编译器自动加一个无参数的构造方法
-
4 构造方法参数列表一般用于给属性赋值
-
5 对象不能调用构造方法
-
6 构造方法被new调用 调用一次 创建一个对象
-
7 构造方法之间的相互调用 通过this(参数列表)
-
8 所有子类构造方法的第一个语句必须是super(参数列表) 默认是super()
- 构造方法和普通方法区别:
-
1 格式不同
-
2 命名不同
-
3 调用不同
-
4 是否有默认
-
5 意义不同:
-
set方法和get方法
private关键字
private(私有的)是修饰符,使用private修饰的成员变量或者方法
只能在当前类中使用
所以使用private修饰后的成员变量就不能在其他类中
访问
注意以后我们声明类的时候,必须将成员变量用private
修饰,然后生成set和get方法
###this关键字
this关键字出现在方法中,表示当前类的对象,一个类可
以有多个对象,谁调用的方法,this指的就是谁
####/*面向对象:oop
* 找具有帮助我解决问题功能的对象 指挥对象解决问题
*4步骤:
* 1 定义一个类 描述一类事物
* 通过成员变量描述数据
* 通过成员方法描述功能
* 2 根据类创建对象
* 引用=new 构造方法();
* 3 给对象的属性赋值
* 对象.属性=值;
* 4 调用对象的方法 解决问题
*
*方法重载:overload
* 一个类中 几个方法名字相同 参数列表不同的现象
* 重载要求: 同一个类 方法名相同 参数列表不同(参数个数不同+参数类型不同+参数顺序不同)
* 重载存在意义:几个方法的功能基本一样 只是需要的原始数据不同
* 重载理解:长得相同的同卵双胞胎
*
*成员变量和局部变量:
* 成员变量:类中定义的变量
* 局部变量:方法中定义的变量
*成员变量和局部变量的区别:
* 1 定义位置不同
* 2 作用域不同
* 3 是否有默认初始值
* 4 修饰符不同:
*
*构造方法:constructor
* 概念:类中 用于构建创造对象的方法
* 特点: 1 格式:没有返回值 不用void标识
* 2 命名:构造方法名字必须是类名
* 3 调用:不能被对象调用 只能被new调用 每调用一次 创建一个对象
* 4 默认:一个类 没有构造方法 编译器默认添加一个无参数的构造方法
* 5 this(参数列表):构造方法之间的相互调用 通过this(参数列表)
*
* this:
* 1 当成员变量与局部变量重名时 方法中的变量名默认指向的是局部变量
* 通过this.变量名来指向成员变量
* 方法中:成员前面默认有this.
* 2 构造方法之间的相互调用 通过this(参数列表)
* this(参数列表)必须是第一个语句
*
* 给属性赋值的方式:
* 1 在类中直接给变量赋值
* 2 对象.属性给属性赋值
* 3 通过构造方法参数列表给属性赋值
* 4 通过普通方法参数列表给属性赋值
*
* 内存图:
* 1 类加载
* 2 创建引用:引用名+对象类型+地址栏
* 3 创建对象:
* 3.1 内存中为对象划分区域
* 3.2 通过构造方法 把类中定义的成员变量和普通方法加载进对象内存中
* 3.3 给对象的成员变量赋初始值
* 3.4 运行构造方法的其他语句:一般是通过构造方法参数列表给属性赋值
* 4 引用指向此对象:
*
* */
static关键字
静态的:关键字:修饰符:修饰成员变量+普通方法+内部类+代码块
static修饰成员变量:
1 不但可以被对象调用 还可以被类名直接调用
2 static修饰的成员变量是共享数据 独一份 本类的所有对象公用这一份数据
static修饰普通方法:
1 不但可以被对象调用 还可以被类名直接调用
2 static修饰的方法中 只能调用静态成员 不能调用非静态成员
被static修饰的成员::类成员
没有被static修饰的成员::实例成员
被static修饰的成员变量–类变量
被static修饰的成员方法–类方法
没有被static修饰的成员变量–实例变量
没有被static修饰的成员方法–实例方法
继承
特点:
1 子类继承父类 父类没有任何影响
2 子类中拥有父类中定义的所有成员
3 子类不能继承父类的构造方法
4 子类可以拥有一些父类没有的成员–子类特有成员
5 子类继承了父类的私有成员 但不能直接使用 只能通过父类的方法间接来使用
6 子类可以根据需求 重新定义父类的已有成员
子类重新定义父类的成员变量 要求:变量名相同即可
子类重新定义父类的成员方法 要求:返回值类型相同 方法名相同 参数列表相同(方法声明完全相同) 重写override
类似于::进化
7 一类如果没有继承其他类 默认继承Object类 :Object类–上帝类
8 java只支持类与类之间的单继承:一个类只能有一个直接父类 但可以有多个间接父类
继承:类与类之间创建关联关系 实现类的复用
final关键字
最终的,修饰符,修饰类+成员变量+局部变量+普通方法
final修饰的变量----常量
final修饰的类:不能被继承。
final修饰的成员变量没有默认初始值。
final修饰的变量值不能被更改,不能重复赋值。
final修饰的方法不能被重写(count override)
常量命名规范
所有字母大写 final String WO_DE_SHEN_FEN_ZHENG_ID=“41112328882867”;
补齐所有默认值:
class Zi01 extends Fu01{
//2 成员变量 有默认m初始
int b;//b=0
void hai() {
//4 子类方法中调用父类的成员前面默认有super.
//super.show();
show();
//4 子类方法中调用父类的成员前面默认有super.
//System.out.println(super.a+":::"+b);
//5方法中调用实例成员 前面默认有this.
//System.out.println(super.a+":::"+this.b);
System.out.println(a+":::"+b);
//6 一个方法没有返回值 return可以省略
//return;
}
//1 一个类没有构造方法 默认一个无参数的构造方法
//public Zi01() {
//3 所有的子类构造方法中第一个语句默认super()调用父类无参数的构造方法
//super();
//6 一个方法没有返回值 return可以省略
//return;
//}
}
多态
一个类出现了多种形态
多态格式:父类引用=子类对象(父类引用指向子类对象)
多态的前提
有继承/实现关系
有方法的重写
父类引用指向子类对象
多态的特点
对于成员方法:编译的时候看=左边,运行的时候看=右边
对于成员变量:编译的时候看=左边,运行的时候看=左边
- 因为成员方法有重写,而成员变量没有。
##什么时候使用多态
定义类的成员变量、方法返回值类型、方法参数列表、数组元素类型时,都定义为父类类型 这样就可以赋值、返回、传递、装 任意子类类型的对象
多态的优缺点
优:
- 提高了程序的扩展性
具体体现:定义方法的时候,使用夫类型作为参数,在使用的时候,使用具体的子类型参与操作
- 降低了耦合度
- 提高了代码的复用性
缺:不能使用子类的特有功能
多态的转向
-
向上转型
从子到父
父类引用指向子类对象
-
向下转型(强转转型)
从父到子
父类引用转为子类对象