Java语言–面向对象
1. 什么是面向对象
拿洗衣服来举例, 传统方式注重的是洗衣服的过程,需要拿盆子->放水->放衣服->放洗衣粉->手搓->换水->手搓->拧干->晾衣服,少一个环节都不行,如果按照这种方式来写代码,将来扩展或者维护代码都比较麻烦,这种就是面向过程的编程.
现在洗衣服可以分成四个对象,人, 衣服, 洗衣机, 洗衣粉,洗衣服的过程就是人将衣服放入洗衣机, 倒入洗衣粉, 启动洗衣机, 洗衣机完成洗衣并甩干, 郑国过程就是人, 衣服, 洗衣机, 洗衣粉四个对象之间进行交互的,人不需要关注洗衣机是如何洗衣服的, 怎么甩干的,这种就是以面向对象的思想来处理问题, 在Java中借助面向对象思想来处理问题,首先就需要用类来描述对象.
2. 类和对象
什么是类, 对象呢?
类和对象就是对现实事物的抽象, 所谓抽象就是将具体的事物简单化, 所展示的信息量较少, 细节也较少. 需要根据实际的场景来决定, 提取哪些信息在代码中表示.
2.1 类和对象的区别
如果将对象比喻成一个一个具体的房子,那么类就是用来盖房子的图纸, 类就是用来构造对象的模板, 构造出来的对象彼此之间有一定的关联关系.
类是自定义类型(高配结构体); 对象就是自定义类型创建出来的变量
2.2 类定义的格式
一个 .java 文件中允许有多个类,其中只能有一个用 public 修饰的类,这个类名必须和文件名相同,但多数情况下一个文件中只有一个类
类里面包含属性和方法, 就相当于把现实事物中的 属性 和 行为 结合到一起了,一个类中包含那些属性和方法需要根据实际场景确定,对于一个对象的字段如果没有显式设置初始值,会被设置一个默认的初始值
package Java_0906;
//一个 .java文件中允许有多个类
//其中只能有一个用public修饰的类
//这个类名字必须和文件名相同
public class Person {
// 属性/成员变量/字段
// 直接写到类里面的变量就是"成员变量"
// 写到方法里面的变量就是"局部变量"
// public 也可以放到成员变量之前
String name;
int age;
String gender;
// 方法/成员函数
public void eat(String food){
System.out.println(name + "正在吃" + food);
}
}
每个属性可以有四种修饰方式: public, private, protected, default
3. 类的实例化
只有一个类还不够, 需要根据这个类创建出一些具体的对象来,这个操作称为"实例化", 对象等价于"实例"
实例化:
Person person1 = new Person();
Person person2 = new Person();
Person person3 = new Person();
当创建好对象之后, 最核心的操作就是访问成员,可以使访问成员属性, 也可以是访问成员方法
相同名字的类不能存在于同一个包中,但是可以在不同的包中(包就相当于目录)
当文件名和public class 修饰的类名字不一样时会报错,如果要修改类名就用 shift + F6 (重构功能)将类名和文件名一起修改
4. 对象的初始化和构造方法
4.1 对象的初始化
写代码时,创建变量的时候最好进行初始化,Java中对于对象的初始化方式有很多种
- 默认值
写一段代码验证一下各种类型的数据默认初始化的值是多少
public class DefaultValue {
public int a;
public long b;
public double c;
public boolean d;
public char e;
public String f;
public int[] g;
}
DefaultValue defaultValue = new DefaultValue();
System.out.println(defaultValue.a);//0
System.out.println(defaultValue.b);//0
System.out.println(defaultValue.c);//0.0
System.out.println(defaultValue.d);//false
System.out.println(defaultValue.e);//
System.out.println(defaultValue.f);//null
System.out.println(defaultValue.g);//null
对于数字来说初始值都是0; 对于 boolean 来说初始值是 false ; 对于引用类型来说初始值是 null
2. 就地初始化
public int a = 0;
public long b = 1000;
public double c = 10.0;
public boolean d = true;
public char e = 'a';
public String f = "hello";
public int[] g = {1, 2, 3, 4};
- 代码块初始化
//大括号就是代码块
//大括号中的代码就会在 new 对象的时候自动执行
{
a = 1000;
b = 2000;
}
- 构造方法初始化
构造方法是一种特殊的方法
- 构造方法的方法名是固定的, 必须和类名相同
- 构造方法不需要 return 语句,但是可以理解成返回了该对象的引用
- 构造方法不需要显式调用, 而是在 new 的时候自动被调用
- 构造方法也支持重载,重载规则和普通的方法一样
public class Cat {
public String name;
public String gender;
public int age;
public String breed;
public String color;
public Cat(){
name = "一月";
gender = "公猫";
age = 1;
breed = "中华田园猫";
color = "橘色";
}
}
public Cat(String name){
// 如果形参和成员变量名字相同
// 就需要在成员变量前面加上this关键字
// this 相当于"我"
this.name = name;
}
this的用法:
- this 指向当前对象的引用
- this 的类型就是当前这个类的类型
- this 这个引用的指向不能修改
- this也可以用来调用方法
- this 不能是 null
利用构造方法重载, 可以根据自己的需求对成员变量进行初始化
System.out.println("请输入猫咪的名字:");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
Cat cat = new Cat(name);
System.out.println(cat.name);
构造方法和代码块谁先执行呢?
在构造方法前面加一个代码块试试
public String color;
{
System.out.println("这是代码块");
name = "二月";
}
public Cat(){
System.out.println("这是构造方法");
name = "一月";
gender = "公猫";
age = 1;
breed = "中华田园猫";
color = "橘色";
}
最后让输出 cat 的名字, 输出结果是: