作者:佳佳要学习
时间:2022年12月20日
本章内容:类和对象
作者想说:如本文有错误之处,可以留言,感谢!
目录
1️⃣. 初识面向对象
1.1 三个理解
①. 记住 OOP :Object Oriented Program
②. 含义 :面向对象是 解决问题的 一种思想,主要依靠对象之间交互完成一件事情。
③. 要区别 面向过程 与 面向对象 的 区别 :
我想用一张图来解释 (小刚今天饿了,需要一份煎饼):
总结:面向过程 是 注重的是做煎饼的过程,少一条步骤都不可以。
面向对象 是 小刚去食堂窗口告诉阿姨,需要一份煎饼。不需要知道怎么做煎饼!
2️⃣. 类定义和使用
面向对象程序设计关注的是 对象,而对象是 现实生活中的实体。比如:金毛犬。开发人员通过代码来 描述金毛犬,从而计算机来认识。

2.1 简单认识类
类 是用来对一个对象来进行描述的,主要描述该对象具有哪些属性(外观尺寸),哪些功能(用来干啥),描述完成后计算机就可以识别了。
比如:金毛犬。
属性:名字,年龄,性别…
行为:玩球,睡觉,吃饭…
2.2 类的定义格式
在Java中定义类时需要用到class关键字:
class ClassName{
field; //成员变量
method; //成员方法
}
class是定义类的关键字, ClassName是类的名字,{}中为类的主体。
class Dog{
public String name; //名字
public int age;//年龄
public String sex; //性别
public void wangwang(){
System.out.println("旺旺!");
}
public void sleep(){
System.out.println("睡觉!");
}
public void eat(){
System.out.println("吃饭!");
}
}
3️⃣. 类的实例化
3.1 什么是实例化
用 类 类型创建对象的过程,称为 类的实例化。关键字:new 。
class Dog{
public String name; //名字
public int age;//年龄
public String sex; //性别
public void wangwang(){
System.out.println(name+"今年"+age+"岁了,它是一个小"+sex+"狗,它正在叫!");
}
public void sleep(){
System.out.println(name+"今年"+age+"岁了,它是一个小"+sex+"狗,它正在睡觉!");
}
public void eat(){
System.out.println(name+"今年"+age+"岁了,它是一个小"+sex+"狗,它正在吃饭!");
}
}
public class Test3 {
public static void main(String[] args) {
//通过new关键字去实例化 狗 类
Dog jinmao = new Dog();
//对成员属性赋值
jinmao.name = "球球";
jinmao.age = 3;
jinmao.sex = "公";
//调用成员方法
jinmao.eat();
Dog dog2 = new Dog();
dog2.name = "方方";
dog2.age = 5;
dog2.sex = "母";
dog2.sleep();
}
}
输出结果:
球球今年3岁了,它是一个小公狗,它正在吃饭!
方方今年5岁了,它是一个小母狗,它正在睡觉!
注意:
①. new关键字用于创建一个对象实例
②. 使用 . 来访问对象中的属性和方法
③. 同一个类可以创建多个实例
3.2 类和对象的说明
-
类可以看做一个模型,对一个实体进行描述。
-
类是一种自定义类型,可以用来定义变量。
-
一个类可以实例化多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。
-
更好理解的方法:类实例化出对象 就像现实中使用 图纸 建造房子,类就是设计图,房子就是根据图纸实例化出来的。
注意:
一般一个文件当中值定义一个类
main方法所在的类一般要使用pubilc修饰。
public修饰的类必须要和文件名相同
不要轻易去修改public修饰的类的名称。
一个java文件只能有一个public类
3.3 成员赋值的几个小问题
-
成员变量没有赋值,直接使用不会报错
引用类型 null int float 对应的0值。 boolean 默认值false。 char 的默认值‘\u0000’ -
当一个引用 赋值为null 的时候,表示这个引用 不指向任何对象
-
引用 能不能指向 引用? 不能
引用不能指向引用,引用是指向对象的。
public static void main(String[] args) { Dog dog1 = new Dog(); Dog dog2 = new Dog(); dog1 = dog2; }

dog1引用 指向了 dog2这个引用 指向的对象
- 一个引用 能不能 同时指向多个对象?不能
4️⃣. this关键字
4.1 含义
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
4.2 this给当前对象赋值
加上this 来表示:给当前对象 赋值
注意:this 只能在成员方法中使用
class Dog{
public String name; //名字
public int age;//年龄
public String sex; //性别
public Dog(){
}
//this关键字,给当前对象赋值
public Dog(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
public class Test3 {
public static void main(String[] args) {
Dog dog1 = new Dog("球球",5,"公");
System.out.println(dog1);
}
}
输出结果:Dog{name='球球', age=5, sex='公'}
4.3 this访问构造方法
class Dog {
public String name; //名字
public int age;//年龄
public String sex; //性别
//this 调用当前对象的其他构造方法。
public Dog() {
//必须放在第一行
//必须在构造方法中使用
this("乐乐", 4, "母");
}
public Dog(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
public class Test3 {
public static void main(String[] args) {
Dog dog2 = new Dog();
System.out.println(dog2);
}
}
输出结果:Dog{name='乐乐', age=4, sex='母'}
注意:不能形成环
//这样就是错的!!!
public Dog() {
this("乐乐", 4, "母");
}
public Dog(String name, int age, String sex) {
this();
}
4.4 this访问成员方法
public Dog(String name, int age, String sex) {
//1. 调用当前对象的其他构造方法
this();
//2. 访问当前对象的成员变量
this.name = name;
this.age = age;
this.sex = sex;
//3. 访问当前对象的成员方法
this.sleep();
}
5️⃣. 封装
5.1 含义与意义
答:把类的实现细节进行了隐藏,对外只提供一些交互的接口就可以。
5.2 访问权限符
| No | 范围 | private | 默认 | protected | public |
|---|---|---|---|---|---|
| 1 | 同一包中的同一类 | √ | √ | √ | √ |
| 2 | 同一包中的不同类 | √ | √ | √ | |
| 3 | 不同包中的子类 | √ | √ | ||
| 4 | 不同包中的非子类 | √ |
5.3 封装
第一步:成员变量的权限是 比较小的。外界不能直接访问该类中的成员变量。
第二步:因为,需要给该类的成员变量进行 赋值与获取值,从而有了 Getter和Setter方法,进行对该成员变量进行操作。
第三步:toString方法,当你想要输出一个对象的引用的值的时候,如果你没有自己写toString方法,那么就会调用Object这个类的方法。如果写了,就用自己的。
class Cat{
//第一步:为了数据的安全性,将成员变量设置为 private
private String name;
private int 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;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
6️⃣. 区分成员/方法
1. 静态成员变量
-
成员变量是使用static修饰的,静态的不依赖于对象。
-
既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
class Cat{ public static String type = "猫"; } public class Test3 { public static void main(String[] args) { //直接使用类名 访问静态成员变量 System.out.println(Cat.type); } } 输出:猫 -
类变量存储在方法区当中
-
生命周期伴随类的一生
2. 普通成员变量
不用 static修饰
3. 静态成员方法
- 只要是用 static 修饰的,都不属于对象,可以用对象调用(会警告)
- 也可以用类名来调用
- 在静态方法内部,不能直接调用非静态的成员方法(实例化对象,在调用他的成员方法)
- 在静态方法内部,不能使用非静态的成员变量(实例化对象,在调用他的成员变量)
- 在静态方法内部,不能使用this
4. 普通成员方法
可以使用静态 的 成员方法
1万+





