1. 类和对象
1.1 类和对象的理解
客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。
- 类
- 类的理解
- 类是对现实生活中一类具有共同属性和行为的事物的抽象
- 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
- 简单理解:类就是对现实事物的一种描述
- 类的组成
- 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
- 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
- 类和对象的关系
- 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
- 对象:是能够看得到摸的着的真实存在的实体
- 简单理解:类是对事物的一种描述,对象则为具体存在的事物
1.2 类的定义
类的组成是由属性和行为两部分组成
- 属性:在类中通过成员变量来体现(类中方法外的变量)
- 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
类的定义步骤:
①定义类
类名首字母建议大写,需要见名知意,驼峰模式。
一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
实际开发中建议还是一个文件定义一个class类。
②编写类的成员变量
修饰符 数据类型 变量名称 = 初始化值;
③编写类的成员方法
1 2 3 4 5 6 7 8 9
| public class 类名 { 变量1的数据类型 变量1; 变量2的数据类型 变量2; … 方法1; 方法2; }
|
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public class Phone { String brand; int price;
public void call() { System.out.println("打电话"); }
public void sendMessage() { System.out.println("发短信"); } }
|
定义类的补充注意事项
定义类技巧
1.3 对象的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
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(); } }
|
2. 对象内存图
2.1 单个对象内存图
1.加载class文件
2.申明局部变量
3.在堆内存中开辟一个空间
4.默认初始化
5.显示初始化
6.构造方法初始化
7.将堆内存中的地址值赋值给左边的局部变量


2.2 多个对象内存图


3. 成员变量和局部变量
3.1 成员变量和局部变量的区别
| 区别 |
成员变量 |
局部变量 |
| 类中位置不同 |
类中方法外 |
方法内部或方法声明上 |
| 初始化值不同 |
有默认初始化值 |
没有默认初始化值,必须先定义,赋值才能使用 |
| 内存中位置不同 |
堆内存 |
栈内存 |
| 生命周期不同 |
随着对象的存在而存在,随着对象的消失而消失 |
随着方法的调用而存在,醉着方法的调用完毕而消失 |
| 作用域 |
整个类中有效 |
当前方法中有效 |
4. 封装
黑马程序员Java P83
4.1 封装思想
封装概述
是面向对象三大特征之一(封装,继承,多态)
有选择的暴露
对象代表什么,就得封装对应的数据,并提供数据对应的行为 (java bean类)
封装代码实现
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
成员变量private,提供对应的getXxx()/setXxx()方法
4.2 private关键字
private是一个权限修饰符,可以用来修饰成员(成员变量,成员方法)
4.3 this关键字
- ==this==修饰的变量用于==指代成员变量==,其主要作用是(区分局部变量和成员变量的重名问题)
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
- 不写this的话就是就近原则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Student { private String name; private int age;
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void setAge(int age) { this.age = age; }
public int getAge() { return age; }
public void show() { System.out.println(name + "," + age); } }
|
- this的内存原理
黑马P89
this的本质:所在方法调用者的地址值
5. 构造方法
5.1 构造方法概述
构造方法是一种特殊的方法,也叫作构造器、构造函数。
- 作用:
创造对象的时候,由虚拟机自动调用构造方法,给成员变量进行初始化(即赋值)的。完成对象数据的初始化
1 2 3 4 5 6
| Student stu = new Student();
|
- 种类
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Student { private String name; private int age;
public Student() { System.out.println("无参构造方法"); }
public void show() { System.out.println(name + "," + age); } }
public class StudentDemo { public static void main(String[] args) { Student s = new Student(); s.show(); } }
|
5.2 构造方法的注意事项
构造方法的定义
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
构造方法的重载
带参构造方法和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
推荐的使用方式
无论是否使用,==都写==无参和带全部参数的构造方法
重要功能!
可以使用带参构造,为成员变量进行初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
class Student { private String name; private int age;
public Student() {}
public Student(String name) { this.name = name; }
public Student(int age) { this.age = age; }
public Student(String name,int age) { this.name = name; this.age = age; }
public void show() { System.out.println(name + "," + age); } }
public class StudentDemo { public static void main(String[] args) { Student s1 = new Student(); s1.show();
Student s2 = new Student("林青霞"); s2.show();
Student s3 = new Student(30); s3.show();
Student s4 = new Student("林青霞",30); s4.show(); } }
|
5.3 标准JavaBean类制作
① 类名需要见名知意
② 成员变量使用private修饰
③ 提供至少两个构造方法
④ 成员方法
- 提供每一个成员变量对应的setXxx()/getXxx()
- 如果还有其他行为,也需要写上
5.4 例1
需求:
定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Student { private String name; private int age;
public Student() { }
public Student(String name, int age) { this.name = name; this.age = age; }
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void setAge(int age) { this.age = age; }
public int getAge() { return age; }
public void show() { System.out.println(name + "," + age); } }
public class StudentDemo { public static void main(String[] args) { Student s1 = new Student(); s1.setName("林青霞"); s1.setAge(30); s1.show();
Student s2 = new Student("林青霞",30); s2.show(); } }
|
5.4 例2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| public class User {
private String username; private String password; private String email; private char gender; private int age;
public User() { }
public User(String username, String password, String email, char gender, int age) { this.username = username; this.password = password; this.email = email; this.gender = gender; this.age = age; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public char getGender() { return gender; }
public void setGender(char gender) { this.gender = gender; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public void eat(){ System.out.println(username + "在吃饭"); } }
public class Test { public static void main(String[] args) {
User u1 = new User(); u1.setUsername("zhangsan"); u1.setPassword("1234qwer"); u1.setEmail("zjl256904767@outlook.com"); u1.setGender('男'); u1.setAge(23); System.out.println(u1.getUsername() + ", " + u1.getPassword() + ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge()); u1.eat();
System.out.println("=============================");
User u2 = new User("lisi","12345678","lisi@outlook.com",'女',24); System.out.println(u2.getUsername() + ", " + u2.getPassword() + ", " + u2.getEmail() + ", " + u2.getGender() + ", " + u2.getAge()); u2.eat(); } }
|
6.基本数据类型与引用数据类型
从内存的角度去解释:
基本数据类型:数据值是存储在自己的空间中
引用数据类型:数据值是存储在其他空间中, 自己空间中存储的是地址值。