正是风雨欲来的时候,火却越烧越旺了
——24.1.20
重点
1.为何使用面向对象思想编程
2.如何使用面向对象思想编程
3.何时使用面向对象思想编程
4.利用代码去描述世间万物的分类
5.在一个类中访问另外一个类中的成员 -> new对象
6.成员变量和局部变量的区别
一、面向对象的介绍
1.面向过程:自己的事情自己干,代表语言:C语言
eg、洗衣服:每一步都自己干 -> 找个盆,加水,放洗衣粉,找搓衣板,开始洗衣
2.面向对象:自己的事情别人帮忙去做,代表语言:Java语言
eg、洗衣服:自己的事情别人干 -> 全自动洗衣机
3.使用面向对象思想编程:方便快捷
很多功能都已经实现好了,只需要将其拿来使用即可,简化了我们自己的编写过程,减少了代码量
4.什么时候使用面向对象思想编程:
调用别人的功能时
在一个类中想使用别的类中的思想时,就使用面向对象思想编程
至于使用的代码功能细节,我们不关心,我们只需要知道如何使用即可
5.如何使用面向对象思想编程:
①new,new. -> 点代表的是调用
②特殊:如果调用的成员带static关键字,我们直接使用类名点即可
二、类和对象
2.1 类(实体类)_class
1.测试类:带main方法的类,主要是运行代码的
2.实体类:是一类事物的抽象表示形式
世间万物的分类:比如:犬类、人类、猫类、鼠标类
组成部分:
1.属性(成员变量):这一类事物有什么
①定义位置:类中方法外
②作用范围:作用于当前类
③定义格式:数据类型 变量名
④默认值:
整数:0 小数:0.0 字符:'\U0000‘ 布尔:false 引用:null
2.行为(成员方法):这一类的事物能干嘛
只需要将方法中所学的static干掉,其他的都一样
只需要将某个分类的属性和行为描述出来,就可以描述这个类
案例
人类
public class Demo65Object02Person {
//属性 -> 成员变量
String name;
int age;
//行为 -> 成员方法
public void eat(){
System.out.println("人要吃饭");
}
public void drink(){
System.out.println("人要喝水");
}
}
动物类
public class Demo66Object03Animal {
String kind;//品种
String color;//颜色
public void eat(){
System.out.println("动物要吃东西");
}
public void sleep(){
System.out.println("动物要睡觉");
}
小明类
public class Demo67Object04Phone {
//属性
String brand;
String color;
int price;
//行为
public void call(String name){
System.out.println("给"+name+"打电话");
}
public String message(){
return "给小明发短信";
}
2.2 对象
1.概述:一类事物的具体体现
2.使用:
①导包
如果两个类在同一个包下,想要使用对方的成员不需要导包
如果两个类不在同一个包下,想要使用对方的成员需要导包
特殊包:java.lang -> 使用lang包下的类,不需要导包 -> String
注:在学习四种权限修饰符前,尽量让两个类在同一个包下
②创建对象:想要使用哪个类中的成员,就new哪个类的对象
类名 对象名 = new 类名() -> 如:Person person = new Person();
Animal animal = new Animal();
③调用成员(成员变量、成员方法) -> 想要使用哪个类中的成员,便用哪个类的对象去点哪个成员
对象名.成员变量名 = 值
对象名.方法名() -> 调用的是无参无返回值的方法
对象名.方法名(实参)-> 调用的是无参有返回值的方法
数据类型 变量名 = 对象名.方法名() -> 调用的是无参有返回值的方法
数据类型 变量名 = 对象名.方法名(实参) -> 调用的是有参有返回值的方法
示例
public class Demo65Object02Person {
//属性 -> 成员变量
String name;
int age;
//行为 -> 成员方法
public void eat(){
System.out.println("人要吃饭");
}
public void drink(){
System.out.println("人要喝水");
}
}
public class Demo66Object03Animal {
String kind;//品种
String color;//颜色
public void eat(){
System.out.println("动物要吃东西");
}
public void sleep(){
System.out.println("动物要睡觉");
}
}
public class Demo67Object04Phone {
//属性
String brand;
String color;
int price;
//行为
public void call(String name){
System.out.println("给"+name+"打电话");
}
public String message(){
return "给小明发短信";
}
}
public static void main(String[] args) {
Demo65Object02Person p = new Demo65Object02Person();
p.age = 21;
p.name = "小明";
p.drink();
p.eat();
System.out.println(p.age);
System.out.println(p.name);
System.out.println("—————————————————————————————————————————————");
Demo66Object03Animal a = new Demo66Object03Animal();
a.color = "白色";
a.kind = "金毛巡回犬";
a.sleep();
a.eat();
System.out.println(a.color);
System.out.println(a.kind);
System.out.println("————————————————————————————————————————————");
Demo67Object04Phone ph = new Demo67Object04Phone();
ph.brand = "oppo findx3pro";
ph.color = "white";
ph.price = 5799;
ph.message();
ph.call("张三");
System.out.println(ph.brand);
System.out.println(ph.color);
System.out.println(ph.price);
ph.call("小明");
ph.message();
}
练习
用代码描述一个手机类,在测试类中为手机类中的属性赋值,并且调用手机类中的功能
public class Demo67Object04Phone {
//属性
String brand;
String color;
int price;
//行为
public void call(String name){
System.out.println("给"+name+"打电话");
}
public String message(){
return "给小明发短信";
}
}
public static void main(String[] args) {
Demo67Object04Phone phone = new Demo67Object04Phone();//手机类类名
phone.brand = "OPPO Findx3Pro";
phone.price = 5599;
phone.color = "白色";
System.out.println(phone.brand);
System.out.println(phone.price);
System.out.println(phone.color);
phone.call("小明");
phone.message();
}
2.3.匿名对象的使用
1.int i = 10;
①int:是数据的类型
②i:变量名
③等号右边的10:真正的数据
2.Person p = new Person()
①等号左边的Person:对象的类型,好比是int
②p:对象名
③等号右边的new Person:真正的数据,是一个Person对象,将这个对象真正创建出来了
1.所谓的匿名对象,其实就是没有等号左边的部分,只有等号右边的部分(对象)
2.使用:
new 对象().成员
3.注意:
①如果只想单纯的调用一个方法,让方法执行,我们可以考虑匿名对象
②但是如果涉及到赋值,千万不要使用匿名对象
示例
public class Demo65Object02Person {
//属性 -> 成员变量
String name;
int age;
//行为 -> 成员方法
public void eat(){
System.out.println("人要吃饭");
}
public void drink(){
System.out.println("人要喝水");
}
}
public class Demo70Object07PersonNoName {
public static void main(String[] args) {
//原始方式
Demo65Object02Person p = new Demo65Object02Person();
p.name = "小明";
System.out.println(p.name);
p.eat();
System.out.println();
//匿名对象方式
new Demo65Object02Person().eat();
}
}
//匿名对象方式:
new Demo65Object02Person().eat();
new Demo65Object02Person().name = "小红";
System.out.println(new Demo65Object02Person().name); //null
//无法输出
涉及到赋值,千万不要使用匿名对象
三、对象的内存解析
1.一个对象的内存图
2.两个对象的内存图
phone1和phone2都是新new出来的对象,所以在堆内存中开辟了两个不同的空间,修改自己空间中的数据不会影响其他空间中的数据
3.两个对象指向同一个空间的内存图
phone2是phone1给的,phone1在内存中保存的是地址值,所以此时phone2和phone1的地址值一样,操作同一片空间中的数据,所以修改一个对象的数据会影响另一个对象
四、成员变量和局部变量的区别
1.定义位置不同*
成员变量:类中方法外
局部变量:方法之中或者参数位置
2.初始化值不同*
成员变量:有默认值,不用手动赋值,可以直接使用
局部变量:没有默认值,必须手动先赋值,才能使用
3.作用范围不同*
成员变量:作用于整个类
局部变量:只作用于自己所在的方法,其他方法用不了
4.内存位置不同
成员变量:在堆中,跟着对象走
局部变量:在栈中,跟着方法走
5.生命周期不同
成员变量:随着对象的产生而产生,随着对象的消失而消失
局部变量:随着方法的调用而产生,随着方法的调用完毕而消失
五、练习
定义一个类MyDate,属性有year、month、day
在定义一个Citizen(公民类),属性有name(String类型),birthday(MyDate类型),idcard(string类型),为这三个属性赋值,然后将值取出
自定义生日类型
//自定义生日类型
public class Demo71Object08MyDate {
int year;
int month;
int day;
}
自定义公民类
//自定义公民类
public class Demo72Object09Citizen {
//姓名
String name; //默认值null
// 生日 Mydate类型
// Mydate属于自定义类型(引用数据类型)
// 这种类型要操作之前,必须要赋值
// 这种自定义对象,需要new对象赋值
Demo71Object08MyDate birthday; //默认值null
//身份证
String idcard; //默认值null
}
主函数
public static void main(String[] args) {
Demo72Object09Citizen citizen = new Demo72Object09Citizen();
citizen.name = "张三";
citizen.idcard = "04214047";
citizen.birthday = new Demo71Object08MyDate();
/*Stringbuilder
citizen.birthday获取的是Mydate对象
再去点year获取的是Mydate对象中的year
链式调用
*/
citizen.birthday.year = 2002;
citizen.birthday.month = 11;
citizen.birthday.day = 4;
System.out.println(citizen.name + "," + citizen.birthday.year + "年"
+ citizen.birthday.month + "月" + citizen.birthday.day + "日 " + "学号:" + citizen.idcard);
}
运行结果
给自定义的类型(引用数据类型)赋值,需要new对象(String比较特殊,可以直接=赋值)