千锋教育2218期2022.10.31

面向对象初始

1. 生活中的面向对象和面向过程对比
烤羊排:
	a. 找一个卖烤羊排的店铺
		1. 导航到店铺
		2. 找个位置,点菜烤羊排
		3. 等
		4. 吃,买单
		5. 走
		
	b. 自己做
		1. 买羊排 ==> 宁夏盐滩羊
		2. 准备的调料 ==> 葱, 姜, 蒜, 孜然, 辣椒, 盐, 洋葱
		3. 半扇羊排 焯水(葱, 姜, 蒜),打去浮沫,煮十五分钟。
		4. 烤制 烤盘铺锡纸
        	烤箱预热 5 分钟(220° 上下火)
			220°上下火 15分钟 翻面 10 分钟 190°
		5. 出炉
		6. 孜然, 辣椒, 盐, 蘸料开吃
		7. 打扫卫生
		
卤牛肉
	a. 找个熟食店购买 
		一斤 85 ~ 95 
		一切打包带走
		吃
	b. 自己做
		1. 买牛肉(牛腩, 上脑)
		2. 调料
			小茴香, 八角, 肉蔻, 草果, 麻椒, 花椒, 桂皮, 香叶, 白芷。
			白酒 老抽 生抽 黄豆酱 耗油 冰糖 葱 姜 蒜
		3. 牛肉 冷水 下锅,焯水(葱, 姜, 料酒)
		4. 香料先泡水,捞出,泡酒
		5. 炒糖色,下葱, 姜, 蒜, 下香料(酒), 酱油炒, 牛肉下!!!加热水
		6. 老抽调色, 盐, 黄豆酱, 耗油, 葱段, 蒜粒, 冰糖
		7. 高压锅 35 分钟 / 小火炖 50 分钟
		8. 肉捞出 ,卤汁过滤保存
		9. 吃 !!! 拌面,拌饭
		
		
面向对象
	找合适的人,办合适的事
面向过程
	亲力亲为,自力更生
2. 类和对象
对象
人类吕布,貂蝉,雷军,乔布斯,Faker
猫类八九,汤姆,哆啦A梦,黑猫警长,虹猫噬元兽
狗类八公,哮天犬,大黄,神犬小七,高飞,糯米
汽车类磊哥的领克01,霹雳火,擎天柱,车牌号豫 A16T1T 的车
类:
	针对于一类事物的描述,包括属性描述和行为描述
	人类为例
		属性表述:身高, 体重, 年龄, 姓名, 性别, 发量
		行为描述:吃饭, 睡觉, 写代码, 打游戏
对象:
	具体的,唯一的,独立的,特殊的个体
3. Java 中定义类的格式
格式:
	class 类名 {
		属性描述
			采用变量方式,存储对应的数据,进行属性描述
			Field 成员变量
		行为描述
			采用方法形式,使用方法声明明确方法所学参数和返回值信息,同时完成对应的功能。
			【Method 成员方法】
	}
	类名有什么要求:
		见名知意,大驼峰命名法(单词首字母大写)
3.1 Java定义类之成员变量
class Person {
	/* 属性描述 ==> 【Filed 成员变量】 */
	/*
	id 成员变量,数据类型为 int 类型,用于描述当前类对应对象的 id 属性
	id 成员变量对应的具体数据,需要在创建对象之后给予赋值操作者
	*/
	int id;
	/*
	name 成员变量,数据类型为 String 字符类型,用于描述当前类对应对象的
	name 属性, 当前 Person 对象 人类对象的姓名
	*/
	String name;
	/*
	age 成员变量,数据类型为 int 类型, 用于描述当前类对应的 age 属性
	age ==> 年龄
	*/
	int age;
}
3.2 Java定义类之成员方法
/**
* 自定义类,当前没有使用 public 关键字
* 类名和文件名不一致
* Person 类型,类名符合见名知意,大驼峰命名法
*/
class Person {
 	/**
	*Person 类吃饭(eat)行为描述,参数为字符串类型参数,要求用户调用时
	* 提供字符串类型参数,告知吃什么事务
	*
	* @param tood 食物的名称 String 字符串类型
	*/
	public void eat(String food) {
		System.out.println("今天吃" + food);
	}
	
	/**
	*
	* Person 类睡觉(sleep)行为描述
	*/
	public void sleep() {
		System.out.println("说出来你可能不信,我被床封印了");
	}
	
	/**
	* Person 类编程/写代码(coding)行为描述
	*/
	public void coding() {
		System.out.println("键盘敲烂,月薪过万");
	}
}
3.3 Java创建对象方式
比葫芦画瓢
	Scanner sc = new Scanner(System.in);

必须清楚的知识点:
	1. Java 开发中存在名称 + 小括号的结构,除分子循环之外,都是方法
		sleep(); eat(String food); coding();
	2. Java 中首字母大写的标识符,按照规定只能是 类名, 接口名

拆分 Scanner 扫描器创建过程:
	Scanner:
		类名, 数据类型名,表示当前创建的是 Scanner 类对应对象,或者说创建的对象数据类型为 Scanner 类型
	sc:
		对象名称,变量名称,同时也是一个【引用数据类型】
	new1. 根据当前数据类型所需,在内存的【堆区】申请对应的内存空间。
			补充:创建对象时根据【构造方法】的名称,明确当前申请空间对应的数据类型是哪一个类型,
			从而确定数据类型占用的空间大小
		2. new 关键字会将申请的内存空间所有的数据内容全部清除干净
	Scanner(实际参数) 构造方法,构造方法要求方法名必须是类名,用于在创建对象的过程中,明确创建对象的数据类型。
	而且在 Java 代码中,有且只允许构造方法使用类名,其他方法一律不允许!!!

目前创建对象
	类名 对象名 = new 构造方法(实际参数);
	/*
	创建对象/实例化对象的格式:
		类名 对象名 = new 构造方法(所需参数);
	*/
	Person p1 = new Person();
	
	/*
	Person@15db9742
		Person 是类型描述,表示当前对象对应的数据类型是什么
		@ 在哪里!!
		15db9742 十六进制,是当前对象在内存空间的地址。门牌号(银平路25号)
	*/
	System.out.println(p1);
3.4 通过对象操作成员变量赋值/取值过程
比葫芦画瓢:
	int[] arr = new int[10];
	arr.length ==> 得到数组的容量
	. ==> 的
	
对象操作成员变量赋值/取值格式
        对象名.成员变量
        	可以执行赋值操作,也可以进行取值操作
/*
	Person 类对象操作成员变量
		目前 Person 类内对应的成员变量有
			int id; String name; int age;
	格式:
		类对象.成员变量
	*/
	// 通过类对象操作成员变量赋值操作  磊哥花名:狗磊
	p1.id = 1;
	p1.name = "狗磊";
	p1.age = "16";
	
	// 通过类对象操作成员变量取值操作
	System.out.println("ID:" +p1.id);
	System.out.println("Name:" +p1.name);
	System.out.println("Age:" +p1.age);
3.5 通过对象调用成员方法
比葫芦画瓢:
	Scanner sc = new Scanner(System.in);
	int类型数据 = sc.nextInt();
	double类型数据 = sc.nextDouble();
	float类型数据 = sc.nextFloat();
	
通过对象调用成员方法的格式:
	对象.方法名(实际参数);
	/*
	Person 对象调用执行成员方法
		对象.成员方法();
		目前 Person 类内对应的成员方法有
			void eat(String); void sleep(); void coding();
	*/
	// 通过 Person 对象 p1调用 eat 方法,方法所需参数为 String 类型
	p1.eat("面叶+馒头");
	p1.sleep();
	p1.coding();
4. 构造方法【鸡肋】
4.1 Java 编译器提供的无参数构造方法
【发现】
	1. 在当前的案例代码中,并没有对应的无参数构造方法,在代码中却可以直接调用
	2. Demo1.java 编译之后,在结果中发现存在有两个 .class 字节码文件,分别是 Demo1.class 和 Person.class 
		因为在 Demo1.java 文件中有两个 class,每一个类/class 都会生成对应的 .class 字节码文件, .class字节码文件中包含完整的参与运行的代码内容。

【反编译 .class 文件】
	给到一些必要的信息,提供给程序员分析代码参与执行的内容

javap - c - l - private XXX.class

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bOXnIMV-1667234515039)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20221031153333019.png)]

【注意】
	Java 编译器是发现当前类没有自己声明/定义构造方法,会自动提供一个无参数构造方法供程序员使用,如果当前 Java 代码中存在任意一个构造方法,Java 编译器不再提供对应的无参数构造方法
4.2 Java 中构造方法
构造方法的作用:
	1. 构造方法的名称必须是类名,用于提供给 new 关键字使用,明确当前实例化/创建的对象对应的数据类型是什么类型
	2. 构造方法有且只有【初始化】 new 关键字 + 构造方法 实例化/创建 对象数据内容功能
	
构造方法格式:
	public 类名(初始化操作必要的参数) {
		初始化赋值语句,给予成员变量赋值操作。
	}
4.3 构造方法案例
/**
* 自定义类型,SingleDog 类
*/
class SingleDog {
	// Single 成员变量
	int id;
	String name;
	int age;
	
	// 无参构造方法
	public SingleDog() {
		System.out.println("无参数构造方法,所有的成员变量都没有初始化,完全对应无数据情况");
	}
	
	// 带有 String 类型参数的构造方法, 用于初始化 name 成员变量
	public SingleDog(String n) {
		/*
		name 是 SingleDog 类的成员变量 String 类型
		n 是构造方法参数,String 类型
		*/
		name = n;
		System.out.println("String 类型参数构造方法,仅初始化 name 成员变量数据内容");
	}
	
	// 带有 int, String 类型参数的构造方法,用于初始化 id,name 成员变量
	public SingleDog(int i, String n) {
		/*
		使用构造方法参数 int 类型 i 给予成员变量 id 赋值操作
		*/
		id = i;
		/*
		使用构造方法参数 String 类型 n 给予成员变量 name 赋值操作
		*/
		name = n;
		System.out.println("int, String 类型参数构造方法,仅初始化 id, name 成员变量数据内容");
	}
	
	// 带有 int, String, int 类型参数的构造方法,用于初始化 id,name,age 成员变量
	public SingleDog(int i, String n, int a) {
		/*
		使用构造方法参数 int 类型 i 给予成员变量 id 赋值操作
		*/
		id = i;
		/*
		使用构造方法参数 String 类型 n 给予成员变量 name 赋值操作
		*/
		name = n;
		/*
		使用构造方法参数 int 类型 a 给予成员变量 age 赋值操作
		*/
		age = a;
		System.out.println("int, String, int 类型参数构造方法,仅初始化 id, name, age 成员变量数据内容");
	}
	
}

public class Demo2 {
	public static void main(String[] args) {
		/* 
		new 关键字 + 无参数构造方法,
		实例化/创建 SingleDog 对象,对象名为 sd1
		*/
		SingleDog sd1 = new SingleDog();
		
		// 展示 sd1 对象成员变数据内容
		System.out.println("sd1 id: " + sd1.id);
		System.out.println("sd1 name: " + sd1.name);
		System.out.println("sd1 age: " + sd1.age);
		System.out.println();
		
		/*
		new 关键字 + String 类型参数的构造方法
		实例化/创建 SingleDog 对象,对象名为 sd2
		*/
		SingleDog sd2 = new SingleDog("张三");
		
		// 展示 sd2 对象成员变数据内容
		System.out.println("sd2 id: " + sd2.id);
		System.out.println("sd2 name: " + sd2.name);
		System.out.println("sd2 age: " + sd2.age);
		System.out.println();
		
		/*
		new 关键字 + int, String 类型参数构造方法
		实例化/创建 SingleDog 对象,对象名为 sd3
		*/
		SingleDog sd3 = new SingleDog(1, "张三");
		
		// 展示 sd3 对象成员变量数据内容
		System.out.println("sd3 id: " + sd3.id);
		System.out.println("sd3 name: " + sd3.name);
		System.out.println("sd3 age: " + sd3.age);
		System.out.println();
		
		/*
		new 关键字 + int, String,int 类型参数构造方法
		实例化/创建 SingleDog 对象,对象名为 sd4
		*/
		SingleDog sd4 = new SingleDog(1, "张三", 20);
		
		// 展示 sd3 对象成员变量数据内容
		System.out.println("sd4 id: " + sd4.id);
		System.out.println("sd4 name: " + sd4.name);
		System.out.println("sd4 age: " + sd4.age);
		System.out.println();
	}
}
4.4 构造方法总结
1. 构造方法格式
	public 类名(必要参数) {
		成员变量赋值语句;
	}
	
2. 实例化/创建对象的格式
	类名 对象名 = new 构造方法(实际参数);
	
3. 实例化对象/创建对象 是由 new + 构造方法 完成
	a. new 关键字根据构造方法名称,明确对应数据类型,在内存【堆区】申请对应的空间
	b. new 关键字将申请的空间进行清理数据,打扫卫生
	c. 构造方法利用参数内容和赋值语句,给予成员变量赋值操作
5. 对象内存分析图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tR6jvq0f-1667234515043)(D:\AQF\teacher\Day12\img\02-对象内存分析图.png)]

6. 作业-十二生肖【重点重点】
要求:
	1. 每一个类对应三个或者三个以上成员变量
	2. 每一个类对应三个或者三个以上成员方法,必须保证有一个成员方法至少有一个参数
	3. 每一个类必须有三个或者是哪个以上的构造方法,并且强制要求有一个无参数构造方法
	4. 【重点】成员变量名称所有类不可重复
    	例如: 
    		Tiger name 成员变量描述名字,其他的 是一个生肖没有名字
    5. 【重点】成员方法名称所有类不可重复
    	例如:
    		Tiger sleep() 成员方法描述睡觉行为,其他 十一个生肖不能睡觉
 	6. 每一个类单独一个文件
		文件名:
			Demo1.java  
				==> public class Demo1
				==> class Tiger
	7. 每一个类必须使用所有构造方法,创建对应对象,并且使用创建对象,调用所有成员变量数据进行展示,和所有成员方法进行执行。
	8. 每一个方法,必须有对应的标准文档注释!!!

以上代码会完成
	1. 12 类
	2. 36个 成员变量 36个 成员方法 36个 构造方法
	3. new 对象 过程 36 次
		调用成员变量 108 次
		调用成员方法 108 次	
class Cat {
	// 每一个类提供三个或者三个以上成员变量,12生肖不允许重复成员内容。
    String name;
    int age;
    char gender;
    
    // 每一个类提供三个或者三个以上的构造方法,必须有无参数构造方法。
    /**
    * Cat 类无参数构造方法
    */
    public Cat() {}
    /**
    * 初始化 name 成员变量构造方法
    *
    * @param name String 类型参数用于初始化 name 成员变量
    */
    public Cat(String n) {
        name = n;
    }
    
    /**
    * 初始化 name, age, gender 成员变量构造方法
    *
    * @param name String 类型参数用于初始化 name 成员变量
    * @param age int 类型参数用于初始化 age 成员变量
    */
    public Cat(String n, int a, char g) {
        name = n;
        age = a;
        gender = g;
    }
    // 每一个类提供三个或者三个以上成员方法,12生肖不允许重复成员方法内容
    /**
    * 吃饭行为描述
    *
    * @param food 食物
    */
    public void eat(String food) {
        System.out.println("可爱的小猫咪吃" + food);
    }
    /**
    * 玩耍行为描述
    */
    public void play() {
        System.out.println("猫玩球");
    }
}
public class Demo3 {
    public static void main(String[] args) {
        // 利用三个构造方法,分别创建对应的对象
        Cat cat1 = new Cat();
        Cat cat2 = new Cat("八九");
        Cat cat3 = new Cat("八九", 3, '母');
        // 利用三个对象,分别展示其中的数据保存情况,并且调用成员方法
        System.out.println("Name:" + cat1.name);
        System.out.println("Age:" + cat1.age);
        System.out.println("Gender:" + cat1.gender);
        cat1.eat("罐头");
        cat1.play();
        cat1.sleep();
        System.out.println();
        
        
        System.out.println("Name:" + cat2.name);
		System.out.println("Age:" + cat2.age);
		System.out.println("Gender:" + cat2.gender);
		cat2.eat("罐头");
		cat2.play();
		cat2.sleep();
		System.out.println();
		
		System.out.println("Name:" + cat3.name);
		System.out.println("Age:" + cat3.age);
		System.out.println("Gender:" + cat3.gender);
		cat3.eat("罐头");
		cat3.play();
		cat3.sleep();
		System.out.println();
    }
}


cat1.sleep();
System.out.println();

    System.out.println("Name:" + cat2.name);
	System.out.println("Age:" + cat2.age);
	System.out.println("Gender:" + cat2.gender);
	cat2.eat("罐头");
	cat2.play();
	cat2.sleep();
	System.out.println();
	
	System.out.println("Name:" + cat3.name);
	System.out.println("Age:" + cat3.age);
	System.out.println("Gender:" + cat3.gender);
	cat3.eat("罐头");
	cat3.play();
	cat3.sleep();
	System.out.println();
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值