对象,类,属性,方法的理解
1.类和对象
1.1 类和对象的理解【理解】
客观存在的事物皆为对象,所以我们也常常说万物皆对象。
- 类
-
类的理解
- 类是对现实生活中一类具有共同属性和行为的事务的抽象
- 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
- 简单理解: 类就是对现实事物的一种描述
-
类的组成
- 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
- 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
-
类和对象的关系
- 类: 类是对现实生活中一类具有共同属性和行为的事物的抽象
- 对象:是能够看得到摸得着的真实存在的实体
- 简单理解: 类是对事务的一种描述,对象则为具体存在的实体
-
1.2 类的定义【应用】
类的组成是由属性和行为两部分组成
- 属性:在类中通过成员变量来体现(类中方法外的变量)
- 行为:在类中通过成员方法来体现(和前面的方法相比去掉 static 关键字即可)
类的定义步骤
- 定义类
- 编写类的成员变量
- 编写类的成员方法
public class 类名 { // 成员变量 变量1的数据类型 变量1; 变量2的数据类型 变量2; ... // 成员方法 方法1; 方法2; }
示例代码:
/*
手机类
类名:
手机(Phone)
成员变量:
品牌(brand)
价格(price)
发短信(sendMessage
*/
public class Phone {
//成员变量
String brand;
int price;
//成员方法
public void call () {
System.out.println("打电话");
}
public void sendMessage() {
System.out.println("发短信");
}
}
1.3 对象的使用【应用】
- 创建对象的格式:
- 类名 对象名 = new 类名();
- 调用成员的格式:
- 对象名.成员变量
- 对象名.成员方法();
- 示例代码
/*
创建对象
格式: 类名 对象名 = new 类名();
范例: Phone p = new Phone();
使用对象
1:使用成员变量
格式: 对象名.变量名
范例: p.brand
2: 使用成员方法
格式: 对象名.方法名()
范例: p.call()
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
p.brand = "小米";
p.price = "2999";
System.out.println(p.brand);
System.out.println(p.price);
//使用成员方法
p.call();
p.sendMessage();
}
}
package com.tengxun.class6.oop1;
/**
* @Auther: Yu Panpan
* @Date: 2021/12/7 - 12 - 07 - 8:55
* @Description: com.tengxun.class6.oop1
* @version: 1.0
*/
/**
* 定义类的时候,属性和方法不是必须的。
* 一个源文件中可以有N个类,但是有且只能有一个public修饰的类,并且这个源文件的名称必须和public修饰的类名一致
*
* 属性:(成员变量)
* 语法:
* [修饰符] 数据类型 属性名 = [默认值];
*
* 注意:
* 1、修饰符和默认值可以没有,没有的时候系统会根据数据类型对应的给默认值
* 2、数据类型和属性名一定要有,属性名的定义要符合合法的标识符命名规范
*
* 方法:
* 语法:
* [修饰符] 方法的返回类型 方法名(形参列表){
* 逻辑代码;
* }
*
* 注意:
* 1、方法可以没有修饰符,java中的修饰符有四个(public、protected、[default]、private后面会讲)
* 2、方法的返回类型可以没有,void代表无值返回
* 3、方法的返回类型可以是任意的数据类型,换句话说可以是基本数据类型,也可以是引用数据类型
* 4、方法的形参列表也可以没有,如果有多个形参列表的时候,需要用逗号
* 5、方法的参数传递是值传递,这个后面再讲
*
* 对象的创建:(实例化的过程)
* ClassName objectName = new ClassName();
*
* 注意:
* 1、通过new关键字创建了一个叫objectName的对象,我们称objectName是ClassName一个实例或者说一个对象
*
* 如何使用属性和方法:
* 1、使用对象.成员
* 2、使用对象.属性 对象.方法 调用
*
*/
public class Student {
//定义属性
int stuNumber; //学号
String name; //姓名
int age; //年龄
//定义一个方法
void introduce(){
System.out.println("学号:" + stuNumber +" 姓名:" +name +" 年龄:" +age);
}
//定义一个吃的方法
public void eat(String food){
System.out.println(name +"正在吃:"+ food);
}
}
测试类TestStudent
package com.tengxun.class6.oop1;
/**
* @Auther: Yu Panpan
* @Date: 2021/12/7 - 12 - 07 - 10:17
* @Description: com.tengxun.class6.oop1
* @version: 1.0
*/
public class TestStudent {
public static void main(String[] args) {
//创建一个对象
Student student = new Student();
//调用方法
student.introduce();
System.out.println("赋值之后... ...");
//修改属性
student.stuNumber = 1001;
student.name = "妞妞";
student.age = 20;
//输出每一个属性
System.out.println(student.stuNumber);
System.out.println(student.name);
System.out.println(student.age);
//调用方法
student.introduce();
student.eat("巴西牛排");
}
}
1.4学生对象-练习【应用】
- 需求:首先定义一个学生类,然后顶一个学生测试类在学生测试类中通过完成成员变量和成员方法的使用
- 分析:
- 成员变量: 姓名,年龄…
- 成员方法:学习,做作业…
- 示例代码
class Student {
//成员变量
String name;
int age;
// 成员方法
public void study() {
System.out.println("好好学习,天天向上");
}
public void doHomework() {
System.out.println("键盘敲烂,月薪过万");
}
}
/*
学生测试类
*/
public class StudentDemo 【
public static void main(String[] args) {
//创建对象
Student s = new Student();
//使用对象
System.out.println(s.name+","+s.age);
s.name = "张三";
s.age = "18";
System.out.println(s.name+","+s.age);
s.study();
s.doHomework();
}
}
package com.tengxun.class6.oop1;
/**
* @Auther: Yu Panpan
* @Date: 2021/12/7 - 12 - 07 - 10:19
* @Description: com.tengxun.class6.oop1
* @version: 1.0
*/
import java.util.Scanner;
/**
* 更改管理员密码
*/
public class Administrator {
//定义属性
String account = "admin";
String password = "123456";
//定义方法输出账号和密码
public void accountInfo(){
System.out.println("账号:" + account +"\t密码:" +password);
}
public static void main(String[] args) {
//创建一个对象
Administrator admin = new Administrator();
System.out.println("未修改密码之前的账号信息------");
admin.accountInfo();
//创建一个Scanner
Scanner sc = new Scanner(System.in);
while(true){
System.out.print("请输入账号名称:");
String accountName = sc.next();
System.out.print("请输入密码:");
String pwd = sc.next();
//验证账号信息是否合法
if(accountName.equals(admin.account) && pwd.equals(admin.password)){
//合法,修改密码
System.out.print("请输入新密码:");
pwd = sc.next();
admin.password = pwd;
break;
}else{
System.out.println("您输入的账号信息有误,请重新输入!");
}
}
//输出修改之后的账号信息
System.out.println("修改密码之后的账户信息------");
admin.accountInfo();
}
}
2. 对象内存图
2.1 单个对象内存图【理解】
-
成员变量使用过程
- 成员方法调用过程
- 总结: 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自得内存区域中,成员方法多个对象共用得一份
-
2.2 多个对象内存图【理解】
- 成员变量使用过程
- 成员方法调用过程
- 总结:
多个对象在堆内存中,都有不同得内存划分,成员变量存储在各自得内存区域中,成员方法多个对象共用得一份
2.3 多个对象指向相同内存图【理解】
- 总结
当多个对象得引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
3.成员变量和局部变量
3.1 成员变量和局部变量的区别【理解】
- 类中位置不同:成员变量(类中方法外)局部变量(方法内部或方法声明上)
- 内存中位置不同:
- 成员变量(堆内存)
- 局部变量(栈内存)
- 生命周期不同:
- 成员变量(随着对象的存在而存在,随着对象的消失而消失)
- 局部变量(随着方法的调用而存在,醉着方法的调用完毕而消失)
- 初始化值不同:
- 成员变量(有默认初始化值)
- 局部变量(没有默认初始化值,必须先定义,赋值才能使用)