一、类和对象概述
1.1 面向对象思想
面向过程👇
面向对象👇
类👇
对象
1.2 类中的内容
-
类名
- 类的名称
-
属性
- 对象具备的特征
- 品种、姓名、年龄、地址...
-
方法
- 对象具备的行为
- 吃饭、睡觉、学习、工作...
-
构造器
- 对象创建过程中完成属性的初始化
二、创建类
2.1 过程
1、确定类名【名词提炼法】
狗子--Dog
猫咪--Cat
学生--Student
2、创建一个新的Java文件
文件名和类名保持一致
3、定义属性
声明变量【一般不用赋值】
int age;
String name;
4、定义方法
目前先不用使用static
public void eat(String food){}
2.2 入门案例
Dog
package com.shine.obj;
/**
* 类名
* Dog
* 属性--特种
* 品种
* 名字
* 年龄
* 性别
* 方法--行为
* 吃饭
* 睡觉
* 玩耍
*/
public class Dog {
// 属性--声明变量【一般不赋值,像方法中声明的形参一样】
String breed;
String name;
int age;
String sex;
// 方法--不用全部添加static
public void eat(String food) {
System.out.println("狗子喜欢吃" + food);
}
public void sleep() {
System.out.println("狗子的作息时间和主人相同");
}
public void play() {
System.out.println("狗子能陪伴主人玩耍");
}
}
Cat
package com.shine.obj;
/**
* 类名
* Cat
* 属性
* 品种
* 名字
* 毛色
* 性别
* 产地
*
* 方法
* 吃饭
* 抓老鼠
*/
public class Cat {
// 属性--特征
String breed;
String name;
int age;
String color;
String address;
// 方法--行为
public void eat(String food) {
System.out.println("猫咪喜欢吃" + food);
}
public void catchMouse() {
System.out.println("猫咪喜欢抓老鼠吃");
}
}
三、对象
3.1 概述
-
类是抽象的
-
类中总结了对象应该具有的属性和行为
-
这些属性和行为没有具体的数据
- 属性只有声明,没有赋值【虽然有默认值】
- 方法没有被调用,方法的形参也没有赋值
-
如果需要使用属性和方法,需要创建此类的对象
-
没有对象--》new一个
3.2 创建对象
Car car = new Car();
Random r = new Random();
Scanner sc = new Scanner(System.in);
package com.shine.obj;
public class TestDog {
public static void main(String[] args) {
/**
* 创建对象的过程
* 1、创建类
* 1.1 类名
* 1.2 属性
* 1.3 方法
* 2、创建对象
* 2.1 new 对象
* 2.2 访问属性【读===写】 对象.属性
* 2.3 调用方法 对象.方法(参数)
*/
// 创建对象
Dog dog = new Dog();
// 访问属性【读--写】
// 读取属性:对象.属性
System.out.println(dog.breed); // 目前没有给属性赋值,有默认值【参考数组】,意义不大
System.out.println(dog.name);
System.out.println(dog.age);
System.out.println(dog.sex);
// 修改属性:对象.属性 = 数据
dog.breed = "黑贝";
dog.name = "道哥";
dog.age = 3;
dog.sex = "雄性";
// 再次读取属性
System.out.println(dog.breed); // 目前已经给属性赋值
System.out.println(dog.name);
System.out.println(dog.age);
System.out.println(dog.sex);
// 调用方法:dog.方法名(参数)
dog.eat("骨头");
dog.sleep();
dog.play();
}
}
3.3 访问属性和方法
访问属性
读取数据
对象.属性
String name = 对象.name;
修改数据
对象.属性 = 数据;
对象.name = "道哥";
访问方法
对象.方法名(参数);
对象.eat("骨头");
3.4 创建类和对象
创建类Student
package com.shine.obj;
/**
* 类名
* Student
*
* 属性
* 学号
* 姓名
* 年龄
* 性别
* 专业
* 学校
*
* 方法
* 学习
* 吃饭
* 玩游戏
*/
public class Student {
// 属性
String stuId;
String name;
int age;
String gender;
String subject;
String school;
// 方法
public void study(String skill) {
System.out.println(name + "正在学习" + skill);
}
public void eat(String food) {
System.out.println(name + "喜欢吃" + food);
}
public void playGame(String game) {
System.out.println(name + "喜欢玩" + game);
}
}
创建对象并使用
package com.shine.obj;
public class TestStudent {
public static void main(String[] args) {
/**
* 1、创建类
* 1.1 类名
* 1.2 属性
* 1.3 方法
*
* 2、创建测试类
* TestStudent
*
* 3、创建对象并使用
* 3.1 new对象
* 3.2 属性赋值
* 3.3 调用属性和方法
*/
// 创建对象
Student stu = new Student();
// 属性赋值
stu.stuId = "10010";
stu.name = "林冲";
stu.age = 22;
stu.gender = "男性";
stu.subject = "武术";
stu.school = "东京文武学院";
// 访问属性
System.out.println(stu.stuId);
System.out.println(stu.name);
System.out.println(stu.age);
System.out.println(stu.gender);
System.out.println(stu.subject);
System.out.println(stu.school);
// 调用方法
stu.study("降龙十八掌");
stu.eat("二斤熟牛肉");
stu.playGame("高衙内");
}
}
3.5 实例变量
- 属性 == 实例变量 == 实例属性 == 成员变量
- 实例变量是定义在类中方法外的变量,是对象的组成部分之一
- 实例变量有默认值,无序赋值即可使用【默认值和数组相同,没有意义】
- 如果创建了多个对象,每个对象都拥有自己的实例变量,互相隔离
| 选项 | 局部变量 | 实例变量 |
|---|---|---|
| 定义位置 | 方法中 | 类中方法外 |
| 默认值 | 无 | 有,同数组元素默认值 |
| 作用范围 | 从定义位置开始到方法结束 | 整个类中都能使用 |
| 存储位置 | 栈 | 堆 |
| 生命周期 | 同方法 | 同对象 |
- 如果局部变量和实例变量重名,优先使用局部变量【就近原则】
3.6 实例方法
- 定义在类中方法外的方法 && 没有static修饰的方法
四、构造器
4.1 概述
-
构造器也称为构造方法
-
是类中一个特殊的方法
- 方法名和类名完全相同
- 没有返回值,也没有返回值类型
- 在创建对象的过程中自动调用,不能通过.的方式调用
4.2 无参构造器
- 如果没有在类中手动书写任何构造方法,JVM赠送一个无参数的构造方法
- 如果已显示定义了构造方法,JVM不再赠送
4.3 有参数的构造器
-
为了给类中的属性赋值
-
如果发生实例变量和局部变量重名的情况:
- 可以使用this.属性明确表示调用实例变量
4.4 构造器案例
People类
package com.shine.constructor;
/**
* 类名
* People
* 属性
* 种类
* 姓名
* 年龄
* 性别
* 地址
* 备注信息
* 方法
* 展示
*/
public class People {
// 属性
String breed;
String name;
int age;
String gender;
String address;
String info;
// 创建构造器
public People() {}
/**
* 有参数的构造器,完成对象属性的赋值
* @param breed
* @param name
* @param age
* @param gender
* @param address
* @param info
*/
public People(String breed, String name, int age, String gender, String address, String info) {
this.breed = breed;
this.name = name;
this.age = age;
this.gender = gender;
this.address = address;
this.info = info;
}
// 方法
public void show() {
System.out.println("People [breed=" + breed + ", name=" + name + ", age=" + age + ", gender=" + gender + ", address="
+ address + ", info=" + info + "]");
}
}
测试
package com.shine.constructor;
public class TestPeople {
public static void main(String[] args) {
// 创建对象
People p = new People();
p.show();
p.breed = "黄色人种";
p.name = "金三顺";
p.age = 22;
p.gender = "女性";
p.address = "汉城";
p.info = "温柔美丽贤惠大方";
p.show();
People pp = new People("黄色人种", "山本一郎", 22, "男性", "我本山中人", "门口有条河");
pp.show();
}
}
4.5 构造器赋值过程
4.6 构造方法重载
五、this关键字
5.1 概述
-
在构造器中可能遇到实例属变量和局部变量重名的情况
- 默认优先使用局部变量,实例变量失效
- 可以使用this.属性的方式来明确就是调用实例变量
5.2 this关键字的用法
调用属性【重点】
- 为了区分局部变量和实例变量
this.属性
调用方法
this.方法(参数);
调用其他构造器
- 能调用类中其他的构造方法
- 必须放在构造方法第一行
- 为了节省代码
this(参数)
案例代码【掌握】
package com.shine.this666;
/**
* 类名
* Car
* 属性
* 品牌
* 型号
* 价格
* 颜色
* 方法
* 展示
*/
public class Car {
// 属性
String brand;
String model;
double price;
String color;
public Car() {}
public Car(String brand, String model) {
super();
this.brand = brand;
this.model = model;
}
public Car(double price, String color) {
super();
this.price = price;
this.color = color;
}
public Car(String brand, String model, double price, String color) {
// this.属性表示调用实例变量
// this.brand = brand;
// this.model = model;
// this(参数)表示调用其本类中的其它构造方法
// 构造器的调用必须放在其他构造器的第一行
this(brand, model);
// this(price, color);
this.price = price;
this.color = color;
// this.方法表示调用实例方法
this.show();
}
// 方法
public void show() {
System.out.println("Car [brand=" + brand + ", model=" + model + ", price=" + price + ", color=" + color + "]");
}
}