文章目录
- 一、类和对象
- 1. 类的定义
- 2. 对象的使用
- 二、对象内存图
- 三、成员变量和局部变量
- 四、封装
- 1. private 关键字
- 2. this 关键字
- 五、构造方法
- 六、标准类制作
一、类和对象
在此之前,我们先了解两个概念,对象和类。
万物皆对象,客观存在的事物皆为对象。
类是对象的数据类型,是对现实生活中一类具有共同属性和行为的事物的抽象。
类是对象的抽象,对象是类的实体!
1. 类的定义
类是 Java 程序的基本组成单位。
是对现实生活中一类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为。
① 属性:在类中通过成员变量来体现(类中方法外的变量);
② 行为:在类中通过成员方法来体现(和前面的方法相比去掉 static 关键字即可)。
public class Phone {
//成员变量
String brand;
int price;
//成员方法
public void call() {
System.out.println("打电话");
}
public void sendMessage() {
System.out.println("发短信");
}
}
2. 对象的使用
① 创建对象
Phone p = new Phone();
② 使用对象
//使用成员变量
p.brand;
//使用成员方法
p.call();
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//给成员变量赋值
p.brand = "华为";
p.price = "2999";
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
//使用成员方法
p.call();
p.sendMessage();
}
}
二、对象内存图
public class StudentTest {
public static void main(String[] args) {
//创建第一个对象并使用
Student s1 = new Student();
s1.name = "林青霞";
s1.age = 30;
System.out.println(s1.name + "," + s1.age);
//把第一个对象的地址赋值给第二个对象
Student s2 = s1;
s2.name = "张曼玉";
s2.age = 28;
System.out.println(s1.name + "," + s1.age);
System.out.println(s2.name + "," + s2.age);
}
}
输出:
林青霞,30
张曼玉,28
张曼玉,28
多个对象指向相同的地址!
三、成员变量和局部变量
成员变量:类中方法外的变量;
局部变量:方法中的变量。
public class Phone {
String brand;
int price;
public void call() {
int i = 0;
System.out.println("打电话");
}
public void sendMessage() {
int j = 0;
System.out.println("发短信");
}
int k;
}
如上代码,其中 brand、price 和 k 是成员变量,i 和 j 是局部变量。
成员变量和局部变量的区别:
四、封装
1. private 关键字
① 是一个权限修饰符;
② 可以修饰成员变量和成员方法;
③ 作用是保护成员不被别的类使用,被 private 修饰的成员只在本类中才能被访问。
针对 private 修饰的成员变量,如果需要被其他类使用,应提供相应的操作:
(1)提供 get变量名() 方法,用于获取成员变量的值,方法用 public 修饰;
(2)提供 set变量名(参数) 方法,用于设置成员变量的值,方法用 public 修饰。
//学生类
public class Student {
String name;
private int age;
//提供get、set方法
public void setAge(int a) {
if (a < 0 || a > 120) {
System.out.println("年龄不正确!");
} else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name + "," + age);
}
}
//学生测试类
public class StudentTest {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//给成变量赋值
s1.name = "刘德华";
s1.setAge(60);
//调用show方法
s.show();
}
}
一个标准类的编写:
① 把成员变量用 private 修饰;
② 提供对应的 get、set 方法。
set、get 后面单词首字母要大写!
2. this 关键字
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 修饰的变量用于指代成员变量,this.age = age 左成员右局部!
(1)封装原则:
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
(2)封装好处:
通过方法来控制成员变量的操作,提高了代码的安全性,把代码用方法进行封装,提高了代码的复用性。
五、构造方法
构造方法是一种特殊的方法,用于创建对象。
private String name;
private int age;
public Student() {
}
public void show() {
System.out.println(name + "," + age);
}
Student s = new Student();
s1.setName("刘德华");
s1.setAge(60);
s1.show(); //刘德华,60
当一个类中没有给任何的构造方法时,系统将会自动给出一个默认的无参构造方法,这就是为什么我们前面即使没写构造方法,程序也可以正常执行。
但是当需要传递参数时,系统将无法给出我们有参构造,需要自己去写:
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "," + age);
}
Student s = new Student("刘德华", 60);
s.show(); //刘德华,60
注意事项:
① 如果没有定义构造方法,系统将给出一个默认的无参构造方法;
② 如果定义了构造方法,系统将不再提供默认的构造方法;
③ 如果自定义了带参构造方法,还需要使用无参构造方法时,就必须再写一个无参构造方法;
④ 推荐使用方式,无论是否使用,都手动书写无参构造方法。
六、标准类制作
//学生类
package com.zxe;
public 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);
}
}
//学生测试类
package com.zxe;
public class StudentDemo {
public static void main(String[] args) {
//无参构造方法创建对象
Student s1 = new Student();
s1.setName("张三");
s1.setAge(23);
s1.show();
//有参构造方法创建对象
Student s2 = new Student("刘德华",60);
s2.show();
}
}