- 1.类和对象
- 2.单个对象内存图
- 3.两个对象内存图
- 4.两个引用指向同一对象内存图
- 5.成员变量和局部变量
- 6.private 关键字
- 7.this 关键字
- 8.this 内存原理
- 9.封装
- 10.构造方法
面向过程编程(POP, Procedure Oriented Programming)是一种以过程为中心的编程思想,功能的每一步都是自己实现的。
面向对象编程(OOP, Object Oriented Programming)是一种以对象为中心的编程思想,通过指挥对象实现具体的功能。
1.类和对象类是对现实生活中一类具有共同属性和行为的事物的抽象。
对象是能够看得到摸得着的真实存在的实体(万物皆对象)。
类是对象的描述,对象是类的实体。
类的组成:
- 属性:事物的各种特征,在代码中通过成员变量来体现(类中方法外的变量)
- 行为:事物存在的功能(能够做的事情),在代码中通过成员方法来体现(和前面学的方法相比,去掉 static 关键字即可)
示例:Student.java
package com.qdu.object1;
public class Student {
String name;
int age;
public void study() {
System.out.println("学习");
}
}
创建对象:类名 对象名 = new 类名();
使用成员变量:对象名.成员变量
使用成员方法:对象名.成员方法();
示例:TestStudent.java
package com.qdu.object1;
public class TestStudent {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.name); // null
System.out.println(stu.age); // 0
stu.name = "张三";
stu.age = 23;
System.out.println(stu.name); // 张三
System.out.println(stu.age); // 23
stu.study();
System.out.println(stu); // com.qdu.object1.Student@b4c966a
// @:分隔符
// b4c966a:十六进制内存地址
// com.qdu.object1.Student:全类名(即包名+类名)
}
}
示例:定义一个手机类,然后定义一个手机测试类,在手机测试类中通过对象完成成员变量和成员方法的使用。
Phone.java
package com.qdu.test1;
public class Phone {
String brand; // 品牌
int price; // 价格
public void call(String name) {
System.out.println("给"+name+"打电话");
}
public void sendMessage() {
System.out.println("群发短信");
}
}
TestPhone.java
package com.qdu.test1;
public class TestPhone {
public static void main(String[] args) {
Phone p = new Phone();
p.brand = "大米";
p.price = 2999;
System.out.println(p.brand + "..." + p.price);
p.call("阿强");
p.sendMessage();
}
}
2.单个对象内存图
3.两个对象内存图
4.两个引用指向同一对象内存图
注意:在堆内存中,对象或数组产生的地址通过任何方式都不能被找到时,就会被判定为内存中的“垃圾”,垃圾会被 Java 垃圾回收器在空闲的时候自动进行清理。
5.成员变量和局部变量成员变量:类中方法外的变量。
局部变量:方法中的变量。
6.private 关键字private 是一个权限修饰符。private 可以修饰成员(成员变量和成员方法)。被 private 修饰的成员只能在本类中才能访问。
针对 private 修饰的成员变量,如果需要被其他类使用,应提供相应的操作:
- 提供 get变量名() 方法,用于获取成员变量的值,方法用 public 修饰
- 提供 set变量名(参数) 方法,用于设置成员变量的值,方法用 public 修饰
Student.java
package com.qdu.test2;
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "..." + age);
}
}
TestStudent.java
package com.qdu.test2;
public class TestStudent {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");
stu.setAge(23);
System.out.println(stu.getName());
System.out.println(stu.getAge());
int age = stu.getAge();
for(int i = 1; i <= age; i++){
System.out.println("生日快乐");
}
stu.show(); // 仅仅是对数据做展示
}
}
7.this 关键字
局部变量和成员变量如果重名,Java 使用的是就近原则。
this 关键字的作用:可以调用本类的成员(成员变量和成员方法),解决局部变量和成员变量的重名问题。
package com.qdu.test2;
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);
}
}
package com.qdu.test2;
public class Test2Student {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("张三");
s1.setAge(23);
s1.show();
}
}
在使用成员变量的时候,系统会默认自动加上 this. 。
this 代表所在类的对象引用。方法被哪个对象调用,this 就代表哪个对象。
示例:
package com.qdu.mthis;
public class Student {
private String name;
public void setName(String name){
System.out.println("[方法中打印this]");
System.out.println(this);
this.name = name;
}
}
package com.qdu.mthis;
public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("[打印对象名]-->s1"); // com.qdu.mthis.Student@b4c966a
System.out.println(s1); // com.qdu.mthis.Student@b4c966a
s1.setName("张三");
System.out.println("----------------------");
Student s2 = new Student();
System.out.println("[打印对象名]-->s2"); // com.qdu.mthis.Student@2f4d3709
System.out.println(s2); // com.qdu.mthis.Student@2f4d3709
s2.setName("李四");
}
}
8.this 内存原理
9.封装
面向对象三大特征:封装,继承,多态。
隐藏实现细节,仅对外暴露公共的访问方式。
问:封装指的就是私有吗?
答:私有仅仅是封装的一种体现。
封装常见的体现:
- 私有成员变量,提供 setXxx 和 getXxx 方法
- 将代码抽取到方法中,这是对代码的一种封装
- 将属性抽取到类当中,这是对数据的一种封装
封装的好处:
- 提高了代码的安全性
- 提高了代码的复用性
构造方法,即构建/创造对象的时候所调用的方法。
格式:
- 方法名与类名相同,大小写也要一致。
- 没有返回值类型,连 void 都没有。
- 没有具体的返回值(不能由 return 带回结果数据)。
执行时机:
- 创建对象的时候调用,每创建一次对象,就会执行一次构造方法。
- 不能手动调用构造方法。
public class Student {
//构造方法
public Student() {
System.out.println("我是Student类的构造方法");
}
}
public class TestStudent {
public static void main(String[] args) {
//创建对象
Student stu1 = new Student(); // 输出:我是Student类的构造方法
Student stu2 = new Student(); // 输出:我是Student类的构造方法
Student stu3 = new Student(); // 输出:我是Student类的构造方法
stu1.Student(); // 报错,不能手动调用构造方法
}
}
构造方法可用于给对象的数据(属性)进行初始化。
无参数构造方法:所有 Student 对象的 age 都是 18,不合理。
带参数构造方法:
如果没有定义构造方法,系统将给出一个默认的无参数构造方法。
如果定义了构造方法,系统将不再提供默认的构造方法。
如果自定义了带参数构造方法,还要使用无参数构造方法,那就必须再写一个无参数构造方法。
建议:无论是否使用,都手动书写无参数构造方法和带参数构造方法。
package com.qdu.constructor;
public class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("我是Student类的构造方法");
}
public void show() {
System.out.println(name + "..." + age);
}
}
package com.qdu.constructor;
public class TestStudent {
public static void main(String[] args) {
Student stu1 = new Student("张三",23);
stu1.show();
Student stu2 = new Student();
}
}
示例:JavaBean类,用于封装数据。
package com.qdu.test3;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show(){
System.out.println(name + "..." + age);
}
}
package com.qdu.test3;
public class TestStudent {
public static void main(String[] args) {
// 1.无参数构造方法创建对象,通过setXxx方法给成员变量进行赋值
Student stu1 = new Student();
stu1.setName("张三");
stu1.setAge(23);
stu1.show();
// 2.通过带参数构造方法直接给属性进行赋值
Student stu2 = new Student("李四",24);
stu2.show();
}
}
在 IDEA 中快速生成默认无参数构造方法及带参数构造方法:
在 IDEA 中快速生成 setXxx 和 getXxx 方法:



