面向对象
编程思想
1. 面向过程的编程思想
解决问题的时候按照一定的过程(流程)
钟点工—> 大象装冰箱 总共分几步
1.开门 2.大象装里面 3.关门
以过程为本–复用–增加了很多冗余
大段的过程 拆分成小段 — 到底是哪一个实体来做的
2.面向对象的编程思想
解决问题的时候按照现实生活中的规律来考虑问题
考虑在这个问题的过程中 有几个实体参与进来
理解为 实体动作动作的支配者 没有实体动作就发生不了
人 冰箱 大象
分析每一类个体都有什么特点 做了哪些事情
大象 特点 大 体重很重
冰箱 特点 有门 容积
人 特点 能做事情 做了哪些事情呢 ? 开冰箱门 装大象 关门
面向对象
1. 类和对象
类----人类 抽象笼统的概念 描述一类事物 肯定是具有相同的特征行为
人类有名字 有年龄 有性别-----静态描述特征(特征)-----属性
人类能吃饭 能说话 能学习-----动态动作行为(做事)-----方法
对象–具体的人 人类中的一个具体的人 郑中拓
郑中拓这个具体的人 有名字 有年龄 有性别
能吃饭 能说话 能学习
在现实生活中 对象是先有的 总结出来的概念(类) 后产生的
在计算机中利用面向对象的思想来做事
需要先自己定义(描述)一个类(型)
想要做事情 需要在描述的类中创建一个具体的个体(对象)出来
个体(对象)来做事
2. 如何在计算机中创建(描述)一个类
1.先创建一个类class
2.类的里面 利用属性或方法去描述这个类
3.创建一个当前类的对象 让对象调用属性/方法做事 对象的创建在哪儿都可以
public class Person {
//这个文件是在计算机内 画的一张图纸
//描述计算机里的人类长成什么样子
//属性--静态描述特点
// 必要的组成部分
// 修饰符 数据类型 属性名字 [= 值];
public String name;//全局变量
public int age;
public String sex;//
//*方法--描述可以做什么事情(动作)
}
3. 类中的成员
类中的四个成员
- 属性 – 静态描述特征(存值)
权限修饰符 [特征修饰符] 属性类型 属性名字 [= 值]; - 方法 – 动态描述行为(做事情)
权限修饰符 [特征修饰符] 返回值类型 方法名字 ([参数列表]) [抛出异常] [{方法体}]
最主要的是方法设计的参数及返回值问题 传递 调用 执行 内存 - 构造方法 – 创建当前类对象(做事情 唯一的事情)
权限修饰符 与类名相同的方法名 ([参数列表]) [抛出异常] {方法体} - 程序块 – 一个特殊的方法(没名 做事情 不用我们调用 构建对象之前调用)
{方法体}
3.1 属性
权限修饰符 [特征修饰符] 属性类型 属性名字 [= 值];
3.2 方法
方法---->做一件事情
权限修饰符 [特征修饰符] 返回值类型 方法名字 (参数列表) [抛出异常] [{
方法体
}]
权限修饰符 返回值类型 方法名字 (参数列表) {
}
1.无参数无返回值
2.无参数有返回值
3.有参数无返回值
4.有参数有返回值
人类有名字 有年龄 有性别----属性
人类能吃饭 能说话 能学习----方法
方法中最主要的两个结构 方法的参数列表 方法的返回值类型
方法体 可以理解为方法是做了一件事情
返回值 可以理解为返回值是这件事情做完了 留下的一个结果
返回值又有 基本数据类型 引用数据类型的区别 (详情见练习1)
参数 可以理解为参数是做事情之前 必须提供的条件(可以多个)
3.3 构造方法
构造方法—做事情
- 作用: 只有一个 构建(构造)当前类的对象
- 写法: 权限修饰符 与类名一致的方法名 (参数列表) [抛出异常]{
一件事情 创建一个对象(当前类Person)
返回对象;
} - 用法: 通过new关键字调用
- 特点:
- 每一个类都有构造方法,若自己在类中没有定义,系统会默认提供一个无参数的构造方法
若在类中自己定义了构造方法,则默认无参数的构造方法即被覆盖 - 构造方法是否存在方法重载?----存在构造方法重载
- 每一个类都有构造方法,若自己在类中没有定义,系统会默认提供一个无参数的构造方法
- 每一个类都有构造方法
若不定义 系统会默认提供构造方法
为什么要定义构造方法? 什么时候需要设计构造方法?
在创建对象的同时 想要一并做一些事情 默认提供的构造方法是不会做的
这个时候我们可以自己定义构造方法(无参数的构造方法内做事 也可以定义带参数的)
如果自定义了有参的构造方法 必须自己添加无参的构造方法(因为添加有参构造方法后 系统就不会再默认添加无参构造方法)
3.4 程序块(代码块)
- 作用: 跟普通方法一样 做事情的
- 写法: 可以认为程序块是一个 没有修饰符 没有参数 没有返回值 没有名字的特殊方法
{
} - 用法: 块也需要调用才能执行 我们自己调用不到(没有名字)
每一次我们调用构造方法之前 系统会帮我们自动的调用一次程序块 让他执行一遍 - 特点: 没有什么重载的概念(压根连名字都没有 连参数都没有)
但是可以在类中定义 多个程序块 - 块可以在里面写一些程序 我想要在创建对象之前执行
overload—方法重载
- 概念:一个类中的一组方法 相同的方法名字 不同的参数列表 这样的一组方法构成了方法重载
参数列表的不同体现在哪里?
参数的个数 参数的类型 参数的顺序 - 作用:为了让使用者便于记忆与调用 只需要记录一个名字 执行不同的操作
- 自己也可以设计方法重载
调用方法的时候 首先通过方法名字定位方法
如果方法名字有一致 可以通过参数的数据类型定位方法
如果没有与传递参数类型一致的方法 可以找一个参数类型可以进行转化(自动) - JDK1.5版本之后 出现了一个新的写法
int… x 动态参数列表 类型固定 个数可以动态 0–n都可以
x本质上就是一个数组 有length属性 有[index]
动态参数列表的方法 不能 与相同意义的数组类型的方法构成方法重载 本质是一样的
动态参数列表的方法 可以不传参数 相当于0个 数组的方法 必须传递参数
动态参数列表在方法的参数中只能存在一份儿 且必须放置在方法参数的末尾
public class TestOverload {
public void test(int...x){//本质数组 int[] x = {1,2,3,4,5,6};
System.out.println("执行了test方法携带动态列表");
for(int i=0;i<x.length;i++){
System.out.println(x[i]);
}
}
public void test() {
System.out.println("执行了test方法没有携带参数");
}
public void test(boolean b) {
System.out.println("执行了test方法带boolean参数" + b);
}
public void test(char c) {
System.out.println("执行了test方法带char参数" + c);
}
public void test(int i) {
System.out.println("执行了test方法带int参数" + i);
}
public void test(String s) {
System.out.println("执行了test方法带String参数" + s);
}
public static void main(String[] args) {
//1.创建对象
TestOverload to = new TestOverload();
to.test(1, 2, 3, 4);
to.test((char) 99);//方法参数传递 类型之间的转化问题
//通过对象.方法名字 调用方法 可以直接通过方法名字定位方法
//如果方法名字一致 通过方法的参数列表类型 来定位方法
//2.通过对象调用方法 方法执行一遍
//to.test(true);//不传参数 不行 传参数 参数类型不匹配 不行
}
}
this关键字
构造方法中 属性与变量重名 必须需要一个代替词 代替对象
- this是一个关键字(指代词) 代替的是某一个对象 (当前调用属性或方法时的那个对象)
- this既然代替的是一个对象
this可以调用什么? 属性 方法 可以
this可以调用构造方法么? 可以 在一个构造方法内可以调用另一个构造方法
通过this(); 省略了构造方法的名字(必须与类名一致)
必须在另一个构造方法内调用 必须在程序的第一行
构造方法 一般方法 有顺序 认为构造方法早于一般方法
在一般方法内调用构造方法呢? 不行
构造方法可以重载 构造方法 调用另一个构造方法呢? - this调用的过程可以放置在哪个位置写?
调用属性或方法 这一行代码 可以放置在类中的任何成员位置 上下顺序随意
4. 命名规则和规约
- 规则
字母 数字 符号 中文
字母 区分大小写
数字 不能开头
符号 _ $
中文 不推荐使用 - 规约
类名字 首字母大写 两个单词以上 每一个首字母都大写
Test TestOne TestOneTwo
属性/方法/变量 驼峰式命名规约 首字母小写 两个单词以上 第二个以后的每一个首字母大写
test testOne testOneTwo
构造方法 与类名一致 类中唯一的大写字母开头的方法
静态常量 全部字母大写 通过_做具体说明 BOOKSTORE_ADMIN
包名 全部字母小写 Java关键字都是小写 注意与关键字不要冲突
所有的名字最好—>见名知意(增强可读性 层次关系缩进 见名知意 注释)
5. 类的加载使用
类描述好了以后是不可以直接做事情
需要创建当前类的对象 通过new的方式
Person p = new Person();
通过p.调用啦 调用属性(存值/取值) 调用方法(执行一次)
public class Person {
//这个文件是在计算机内 画的一张图纸
//描述计算机里的人类长成什么样子
//属性--静态描述特点
// 必要的组成部分
// 权限修饰符 [特征修饰符] 数据类型 属性名字 [= 值];
public String name;//全局变量
public int age;
public String sex;//
//*方法--描述可以做什么事情(动作)
//设计一个方法 用来描述人类可以做吃饭这件事情
public void eat(){
System.out.println("吃了一碗大米饭");
}
//设计一个方法 用来告诉别人我的名字 "郑中拓"
//若方法的设计规定了返回值类型 方法内必须通过return关键字返回一个值
public String tellName(){
System.out.println("你们问我叫什么呀?勉强告诉你们一下");
return "郑中拓";//只有一个
}
//设计一个新的吃饭方法
//描述人类可以做吃饭饭这件事情
public void chiFanFan(int count,String something){
System.out.println("吃了"+count+"碗"+something);
}
//设计一个方法 买饮料 1.需不需要提供条件 2.需不需要给别人留下什么结果
// 需要提供条件 钱
// 需要返回值 买到的饮料 名字
public String buyDrink(int money){
if(money>5){
return "红牛";
}else{
return "矿泉水";
}
}
}
调用
public class Test {
//这个类没有什么现实意义
//只是为了将主方法写在这里
public static void main(String[] args){
// 1.创建一个对象 人类的对象
Person p = new Person();
p.drawStar(5,true);
String drinkName = p.buyDrink(10);
System.out.println("买到了一瓶:"+drinkName);
p.chiFanFan(2,"面条");
String myName = p.tellName();
System.out.println("接收到了tellName方法的返回值:"+myName);
}
}
5.1形参和实参
形参可以理解为是方法执行时的临时变量空间 x
实参可以理解为是方法调用时传递进去的参数 a
方法调用时会将实参的内容传递给形参
如果内容是基本类型 传递的 是值 形参改变 实参不变
如果内容是引用类型 传递的 是引用 形参改变 实参跟着改变
详情案例见练习1