1 类和对象的初步认识
Java是一门纯面相对象的语言(Object Oriented Program)
1.1 主观理解
对象、类:表示具体问题中针对一些事物的抽象,所谓抽象就是用代码来表示现实中的东西。
可以将类和对象想象成模具和点心:
类 -->模具
对象 -->点心
我们通过这一猫爪模具可以做出很多猫爪小点心,这个猫爪模具就是一个类,这些猫爪小点心就是对象。
有各种各样的模具,通过不同的模具可以做出不同的点心,也就是说由各种类可以创建很多对象。
1.2 代码/语法的角度
类:自定义类型 (高配结构体)
对象:自定义类型创建出来的变量
2 类的定义和使用
2.1类的定义、实例化
类,相当于把现实事物中的属性和行为结合到一起。
class Cat {
public String name;//名字
public int age;//年龄
public String color;//颜色
public double weight;//体重
public String gender;//性别
//猫的行为,即方法
public void barks() {
System.out.println("mewing,mewing");
}
public void jump() {
System.out.println("jump,jump");
}
}
有了类后,需要根据类创建出具体的对象。这个操作也称为“实例化”。对象(object)等价于 实例(instance)
Cat cat1= new Cat();
Cat cat2= new Cat();
Cat cat3= new Cat();
//这是三个不同的对象
//同一个类,可以创建出很多个实例
注意:
创建好对象/实例之后,最核心的操作就是访问成员(通过" . "操作)。所谓成员是指:成员变量(属性)和成员函数(方法)
Cat cat= new Cat();
cat.name = "糯米";
System.out.println(cat.name);
cat.eat("鱼");
2.2 常见的类定义错误
(1) 同一个包里面,不能有两个相同的类;不同包里可以有同名的类。
class TestDemo {
}
public class TestDemo {
public static void main(String[] args) {
System.out.println("hello");
}
}
(2) 修改public 修饰的类时要注意
a .java文件名要和public 类名一致,为什么呢,因为这样虚拟机在相应路径找到相应类对应的字节码文件比较方便。
b 编译器在编译时,针对一个 .java源代码文件,只会接受一个public 类。
因此,修改public 修饰的类名时,最好右击该类通过 Refactor => Rename 的方式修改。就能同时修改文件名和类名,以及在程序中用到此类的地方。(小技巧:shift + F6可以触发refactor 功能,同时修改文件名和类名,以及在程序中用到此类的地方)
3 类的成员
3.1 成员变量/属性/字段
成员变量:在类中,但是在方法的外面,就叫做成员变量/属性/字段。可以就地初始化,给它赋一个值,也可以先不赋值,有默认初始值。(最好初始化)
public String name;
public String gender;
public int age;
public String breed;
public String color;
注意:
1、使用 . 访问对象的成员;
2、“访问” 既包含读, 也包含写;
3、对于一个对象的字段如果没有显式设置初始值, 那么会被设置一个默认的初始值。各种类型的默认初始值不同,在下面的4.1 节中会具体讨论。
3.2 方法
1、方法:用于描述一个对象的行为。
方法中的属性为局部变量。
public void eat(String food){
System.out.println(name+"正在吃"+food);
}
public void sleep(){
System.out.println(name+"正在睡觉");
}
2、方法中有一种特殊的方法叫做 构造方法:
在实例化对象的时候会被自动调用到的方法, 方法名字和类名相同, 用于对象的初始化 。虽然我们前面已经能将属性就地初始化, 但是有些时候可能需要进行一些更复杂的初始化逻辑, 那么就可以使用构造方法。
4 对象的初始化
写代码时,但凡是创建变量,最好初始化。
对象初始化的方式:
4.1 默认值
不同类型默认值不同
我们可以通过运行看到它们的默认值
public int a;
public long b;
public byte c;
public double d;
public boolean e;
public char f; // 空格 \u000 unicode码
public String g; //引用类型初始值为null
public int[] h;
规则:
1、数字默认初始值为0
2、boolean默认初始值是false
3、引用类型默认初始值是null
4.2 就地初始化
即定义时就给定初始化的值
public int a = 100;
4.3 代码块初始化
大括号中的就是代码块,会在new对象时自动执行。代码初始化和就地初始化是同一级别,哪个先出现哪个先执行。
public int a=100; //先执行
{
a = 0; //后执行,为最终结果
}
所以最后结果为 a = 0。
4.4 构造方法初始化
1、构造方法的特殊之处:
(1) 构造方法的方法名固定,必须和类名相同;
(2) 构造方法不需要return 语句,但可以理解成返回了该对象的引用
(3) 构造方法不需要显示调用,而是在new 的时候自动被调用
(4) 构造方法支持重载,重载规则和普通方法一样
2、构造方法的使用:
(程序员直接给出,用户不能修改)
Alt + insert 触发 Generate可以自动创建构造方法
3、this的使用:
(1) this 指向当前对象的引用;
(2) this 的类型就是当前这个类的类型;
(3) this 这个引用的指向不能修改;
(4) this 也可以用来调用方法;
(5) this 不能是null。
public class Cat {
String name;
String gender;
public Cat(String name, String gender) {
this.name = name;
this.gender = gender;
this.eat("鱼");
}
public void eat(String food){
System.out.println(name + "正在吃" + food);
}
}
4、由用户输入对其属性进行定义(与上面的代码可以并存,重载)
System.out.println("请输入一个名字:");
public Cat(String name){
//表示当前对象的引用,相当于“我”
//this.name 成员变量;name 当前方法的参数
this.name = name;
5、代码块和构造方法的先后顺序
public Cat(){
name = "糯米";
gender = "公猫";
age = 1;
breed = "中华田园猫";
color = "橘色";
}
{
name = "苹果";
}
运行结果为:糯米(先执行代码块,后执行构造方法)
5 toString
1、当我们创建了一个小猫的对象,然后想看这个对象里面是什么时,不能直接打印。
public static void main(String[] args) {
Cat cat = new Cat("糯米","公猫");
System.out.println(cat);
}
直接打印,会打印出来这样的东西,但是我们想要看到的是里面的内容,比如,小猫的名字、性别。
2、我们在我们创建的Cat 类中可以再加一个toString 方法,这样打印就可以直接打印出里面的内容。
public String toString(){
return this.name + "," + this.gender;
}
3、我么还可以借助IDEA来自动生成
类似于上面自动创建构造方法,Alt + insert 触发Generate也可以自动创建toString。打印的也很好看,有一定的格式。
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}