回顾与重点
模块六回顾
-
方法概述:拥有功能性代码的代码块
将来干开发一个功能就应该对应一个方法
-
方法的通用定义格式
修饰符 返回值类型 方法名(参数) { 方法体 return 结果 }
a. 修饰符:public static
b. 返回值类型:方法最终返回的结果的数据类型
c. 方法名:给方法取名字,见名知意,小驼峰式
d. 参数:进入到方法内部参与执行的数据
e. 方法体:具体实现该方法的具体代码
f. return 结果:该方法操作完参数之后,最终返回的一个数据
-
无参无返回值方法
a. 定义
public static void 方法名() { 方法体 }
b. 调用
方法名()
-
有参无返回值方法
a. 定义
public static void 方法名(形参) { 方法体 }
b.调用
方法名(实参)
-
无参有返回值方法
a. 定义
public static 返回值类型 方法名() { 方法体 return 结果 }
b.调用
打印调用:sout(方法名()) → 不推荐使用
赋值调用:数据类型 变量名 = 方法名() → 推荐使用
-
有参有返回值方法
a. 定义
public static 返回值类型 方法名(形参) { 方法体 return 结果 }
b.调用
打印调用:sout(方法名(实参)) → 不推荐使用
赋值调用:数据类型 变量名 = 方法名(实参) → 推荐使用
-
注意事项
a. 方法不调用不执行,main方法是jvm(虚拟机)调用的
b. 方法之间不能互相调用
c. 方法的执行顺序只和调用顺序有关
d. void不能和【return 结果】共存,但是能和【return】共存
void:代表没有返回值
return 结果:代表有返回值,先将结果返回,在结束方法
return:仅仅代表结束方法
e. 一个方法中不能连续写多个return
f. 调用方法时,需要看有没有此方法
-
参数和返回值使用时机
a. 参数:当想将一个方法中的数据,传递到另外一个方法中操作,就需要参数了
b. 返回值:如果调用者需要使用被调用者的结果,被调用者就需要将自己的结果返回
-
方法的重载
a. 概述:方法名相同,参数列表不同
b. 什么叫参数列表不同:
参数个数不同,类型不同,类型顺序不同
c. 和什么无关:
和参数名无关,和返回值无关
模块七重点
- 知道为啥使用面向对象思想编程
- 知道怎么使用面向对象思想编程
- 知道什么时候使用面向对象思想编程
- 会利用代码去描述世间万物的分类
- 会在一个类中访问另一个类中的成员 → new 对象
- 成员变量和局部变量的区别
第一章 类和对象
1.1 面向对象介绍
-
面向过程:自己的事情自己干,代表语言(C语言)
-
面向对象:自己的事情别人帮忙干,代表语言(Java语言)
-
为啥要使用面向对象思想编程
很多功能别人都给我们实现好了,我们只需要直接拿过来使用即可,简化了我们自己的编写过程,减少了我们的代码量
-
什么时候使用面向对象思想编程
在一个类中想使用别的类中的成员是,就是用面向对象思想编程
至于我们使用的功能,人家怎么实现的,我们不需要关心,我们只需要知道怎么使用即可。
import java.util.Arrays; import java.util.Random; import java.util.Scanner; /* 在一个类中想使用别的类中的成员是,就是用面向对象思想编程 */ public class Demo01Object { public static void main(String[] args) { /* 我们想在 Demo01Object 类中使用 Scanner 类中的 next 方法实现录入字符串 那么我们就需要使用面向对象思想编程 对象:Scanner → new 出来的 对象实现好的功能:next() 我们只需要知道找来 Scanner 这个对象,就可以调用这个对象中实现好的 next 方法 至于 next 方法怎么实现的,我们不需要关心 */ Scanner sc = new Scanner(System.in); String data = sc.next(); System.out.println("data = " + data); System.out.println("====================="); /* 我们想在 Demo01Object 类中使用 Random 类中的 nextInt 方法实现录入字符串 那么我们就需要使用面向对象思想编程 对象:Random → new 出来的 对象实现好的功能:nextInt() 我们只需要知道找来 Random 这个对象,就可以调用这个对象中实现好的 nextInt 方法 至于 nextInt 方法怎么实现的,我们不需要关心 */ Random rd = new Random(); int data1 = rd.nextInt(); System.out.println("data1 = " + data1); System.out.println("====================="); int[] arr = {1, 2 ,3, 4}; /*System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { System.out.print(arr[i] + "]"); } else { System.out.print(arr[i]+","); } }*/ /* Arrays 就是我们找来的对象 toString 就是此对象中实现好的功能 我们只需要调用,怎么实现我们不关心 */ System.out.println(Arrays.toString(arr)); } }
-
怎么使用面向对象思想编程
a. new 对象 → new完,点方法名调用
b. 特殊:如果调用的成员带 static 关键字,我们不需要 new ,我们直接类名点即可。
1.2 类和对象
1.2.1 类(实体类)_class
- 测试类:带main方法的类,主要是运行代码的
- 实体类:是一类事物的抽象表示形式,世间万物的分类,比如:人类 狗类 猫类 鼠标类
组成部分:
-
属性(成员变量):这一类事物有啥
a. 定义位置:类中方法外
b. 作用范围:作用于当前类
c. 定义格式:数据类型 变量名
d. 默认值:
整数:0
小数:0.0
字符:‘\n0000’
布尔:false
引用:null
-
行为(成员方法):这一类事物都能干啥
只需要将模块六所学的方法中的 static 干掉,其他的都一样
人类描述
public class Person { // 属性 → 成员变量 String name; int age; // 行为 → 成员方法 public void eat() { System.out.println("人要干饭"); } public void drink() { System.out.println("人要喝水"); } }
动物类描述
public class Animal { String kind; // 品种 String color; // 颜色 public void eat() { System.out.println("动物要吃饭"); } public void sleep() { System.out.println("动物要睡觉"); } }
描述手机类
public class Phone { // 属性 String brand; String color; int price; // 行为 public void call(String name) { System.out.println("给" + name + "打电话"); } public String message() { return "给金莲发短信"; } }
1.2.2 对象
-
概述:一类事物的具体体现
-
作用:
a. 导包
import 包名.类名
如果两个类在同一个包下,想要使用对方的成员不需要导包;如果两个类不在同一个包下,想要使用对方的成员需要导包。
特殊包:java.lang → 使用 lang 包下的类,不需要导包 → String
友情提示:在学四种权限修饰符之前,尽量让两个类在同一包下
b. 创建对象:想要使用哪个类中的成员,就 new 哪个对象
类名 对象名 = new 类名() → 比如:Person person = new Person()
c. 调用成员(成员变量、成员方法)→ 想要使用哪个类中的成员,就用哪个类的对象去点那个成员
对象名.成员变量名 = 值 对象名.方法名() → 调用的是无参无返回值方法 对象名.方法名(实参) → 调用的是有参无返回值方法 数据类型 变量名 = 对象名.方法名() → 调用的是无参有返回值方法 数据类型 变量名 = 对象名.方法名(实参) → 调用的是有参有返回值方法
public class Person { // 属性 → 成员变量 String name; int age; // 行为 → 成员方法 public void eat() { System.out.println("人要干饭"); } public void drink() { System.out.println("人要喝水"); } } /*============================================*/ public class Demo01Person { public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); System.out.println(person.age); person.name = "张三"; person.age = 26; System.out.println(person.name); System.out.println(person.age); person.eat(); person.drink(); } }
1.2.3 练习
需求:用代码去描述一个手机类,在测试类中为手机属性赋值,并调用手机类中的功能
public class Phone {
// 属性
String brand;
String color;
int price;
// 行为
public void call(String name) {
System.out.println("给" + name + "打电话");
}
public String message() {
return "给金莲发短信";
}
}
/*=====================================*/
public class Demo02Phone {
public static void main(String[] args) {
Phone phone = new Phone();
phone.brand = "苹果";
phone.color = "黑色";
phone.price = 7999;
System.out.println(phone.brand);
System.out.println(phone.color);
System.out.println(phone.price);
phone.call("金莲");
String mess = phone.message();
System.out.println("mess = " + mess);
}
}
第二章 匿名对象的使用
-
所谓的匿名对象:其实就是没有等号左边的部分,只有等号右边的部分(对象)
比如:
int i = 10
a. int:是数据类型
b. i:变量名
c. 等号右边的10:真正的数据Person p = new Person()
a. 等号左边的Person:对象的类型,好比是int
b. p:对象名
c. 等号右边的new Person():真正的数据,是一个Person对象,将这个对象真正创建出来了 -
使用
new 对象().成员
-
注意
a. 如果我们只想单纯的调用一个方法,让方法执行,我们可以考虑使用匿名对象
b. 但是如果涉及到赋值,千万不要用匿名对象
public class Person {
String name;
public void eat(){
System.out.println("人要吃饭");
}
}
/*==================================*/
public class Demo01Person {
public static void main(String[] args) {
// 原始方式
Person person = new Person();
person.name = "金莲";
System.out.println(person.name);
person.eat();
System.out.println("============");
// 匿名对象
new Person().eat();
new Person().name = "大郎";
System.out.println(new Person().name); // null
}
}
第三章 对象的内存解析
3.1 一个对象的内存图
public class Phone {
String brand;
int price;
public void call() {
System.out.println("给金莲打电话");
}
}
/*==============================*/
public class Demo01Phone {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p); // 地址值
System.out.println(p.brand); // null
System.out.println(p.price); // 0
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand); // 小米
System.out.println(p.price); // 2999
p.call();
}
}
3.2 两个对象的内存图
public class Phone {
String brand;
int price;
public void call() {
System.out.println("给金莲打电话");
}
}
/*================================*/
public class Demo02Phone {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p); // 地址值
System.out.println(p.brand); // null
System.out.println(p.price); // 0
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand); // 小米
System.out.println(p.price); // 2999
System.out.println("===================");
Phone p1 = new Phone();
System.out.println(p1); // 地址值
p1.brand = "华为";
p1.price = 6999;
System.out.println(p1.brand); // 华为
System.out.println(p1.price); // 6999
}
}
p 和 p1 都是 new 出来的对象,所以在堆内存中开辟了两个不同的空间,修改自己空间中的数据不会影响其他空间的数据。
3.3 两个对象指向同一片空间的内存图
public class Phone {
String brand;
int price;
public void call() {
System.out.println("给金莲打电话");
}
}
/*================================*/
public class Demo03Phone {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p); // 地址值
System.out.println(p.brand); // null
System.out.println(p.price); // 0
p.brand = "小米";
p.price = 2999;
Phone p1 = p;
System.out.println(p1); // 地址值
p1.brand = "华为";
p1.price = 6999;
System.out.println(p.brand); // 华为
System.out.println(p.price); // 6999
System.out.println(p1.brand); // 华为
System.out.println(p1.price); // 6999
}
}
p1 是 p 给的,p在内存中保存的是地址值,所以此时p1和p的地址值是一样的,操作同一片空间中的数据,所以修改一个对象会影响另外一个对象。
第四章 成员变量和局部变量的区别
-
定义位置不同(重点)
a. 成员变量:类中方法外
b. 局部变量:定义在方法之中或者参数位置
-
初始化值不同(重点)
a. 成员变量:有默认值,所以不用先手动赋值,就可以直接使用
b. 局部变量:是没有默认值的,所以需要先手动赋值,再使用
-
作用范围不同(重点)
a. 成员变量:作用域整个类
b. 局部变量:只作用于自己所在的方法,其他方法使用不了
-
内存位置不同(了解)
a. 成员变量:在堆中,跟着对象走
b. 局部变量:在栈中,跟着方法走
-
生命周期不同(了解)
a. 成员变量:随着对象的创建而产生,随着对象的消失而消失
b. 局部变量:随着方法的调用而产生,随着方法的调用完毕而消失
public class Person {
String name; // 成员变量
public void eat() {
int i = 10; // 局部变量
System.out.println(name); // 成员变量不用手动赋值就可以直接使用,因为有默认值
}
public void drink() {
int j;
// System.out.println(j); // 局部变量没有默认值,所以需要手动赋值,再使用
System.out.println(name);
// System.out.println(i); // i 是 eat 方法的局部变量, 在 drink 中使用不了
}
}
第五章 练习
需求:定义一个类 MyDate,属性有 year、month、day;再定义一个类Citizen(公民类),属性有name(String类型)、birthday(MyDate类型)、idCard(String),为这三个属性赋值,然后将值取出来
// MyDate 类
public class MyDate {
int year;
int month;
int day;
}
// Citizen 类
public class Citizen {
// 姓名
String name;
/*
生日 MyDate 类型
MyDate 属于自定义类型(引用数据类型)
这种类型要操作之前,必须要赋值
怎么赋值?需要 new 对象赋值
*/
MyDate birthday = new MyDate(); // 默认值 null
// 身份证
String idCard;
}
// 测试类
public class Demo01Exercise {
public static void main(String[] args) {
Citizen citizen = new Citizen();
citizen.name = "张三";
/*
citizen.birthday 获取的是 MyDate 对象
再去点year获取的是MyDate对象中的year
链式调用
*/
citizen.birthday.year = 2000;
citizen.birthday.month = 2;
citizen.birthday.day = 28;
citizen.idCard = "522321199103253718";
System.out.println(citizen.name+","+citizen.birthday.year+"-"+citizen.birthday.month+"-"+citizen.birthday.day+","+citizen.idCard);
}
}
给自定义类型(引用数据类型)赋值,需要new对象(String类型比较特殊,可以直接等号赋值)