目录
一,什么是面向对象
从所周知,JAVA是一门面向对象的编程语言,那么什么是所谓的面向对象呢?打个比方,现在人们洗衣服,我们只需要将衣服和洗衣粉倒入洗衣机里,定个时就可以了,从面向对象的角度说,我们只关注人,衣服,洗衣粉,洗衣机这几个对象就可以了,不需要去探究这些对象是如何协作来完成洗衣服这件事情。这就是所谓的面向对象。(现在可能还是有点抽象,接着往下看!)
二,类的定义和实例化
2.1什么是类
类就是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。比如我们要描述一个狗,它的属性包括:名字,年龄,性别等等,它的‘ 功能 ’包括:会吃狗粮 ,会叫等等。
从描述来看,JAVA当中的类与C语言中的结构体十分类似,都是用来描述一个对象的特征,都可以用 类名(或结构名)+‘ . ’ 来访问成员变量 ,但是在JAVA中,类还可以描述一个对象的行为特征(往下看)。
2.2类的定义格式
在C语言中我们用 struct 关键字来定义一个结构体,而在JAVA中,我们用 class 关键字来定义一个类,我们用上面提到的狗来举例:
class Dog{
/*
先使用public,了解封装后就可以理解了
这里的name,age,sex都是成员变量(也称字段)
*/
public String name;
public int age;
public String sex;
/*
这里的eat,bark都是成员方法(也称行为)
*/
public void eat(){
System.out.println("吃狗粮!");
}
public void bark(){
System.out.println("汪汪叫!");
}
}
注意:JAVA中,类名一般使用大驼峰来定义(比如WashMachine),而方法一般使用小驼峰来定义(比如washMachine)。
2.3类的实例化
在JAVA中我们使用 new 来实例化一个对象,比如:
class Dog{
public String name;
public int age;
public String sex;
public void eat(){
System.out.println(name + "吃狗粮!");
}
public void bark(){
System.out.println(name + "汪汪叫!");
}
}
public class Test {
public static void main(String[] args) {
// 同一个类可以创建多个对象
Dog dog = new Dog();
Dog dog1 = new Dog();
/**
* 我们可以通过 类名.方法名(或成员变量)
* 来访问创建对象的变量或方法
*/
dog.name = "lisa";
dog.age = 10;
dog.eat();
dog.bark();
}
}
我们再画图了解一下创建的实例所存储的位置:
2.4类和对象的关系
1. 类只是一个模型,用来对一个实体进行描述,限定了类有哪些成员.
2. 类是一种自定义的类型,可以用来定义变量.
3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
4. 打个比方类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
三,this引用关键字
3.1 this的定义和使用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。也就是说,我们可以通过 this.成员变量(或方法名) 在该类的方法中调用该类的成员变量和成员方法,举一个例子:
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(this.name + "吃粮食!");
}
public void get(String a, int b) {
this.name = a;
this.age = b;
this.eat();
}
}
注:this.成员变量(或方法名) 这种用法只能在该类的成员方法中使用!!!
了解了this引用的定义和使用,我想问一个问题“ 当我们实例化了多个对象, this引用是怎样判断它引用的是哪个对象成员方法和成员变量呢?”,其实我们在类中定义一个成员方法时,编译器会默认在第一个参数前面添加一个参数,即 类名+this ,我写了如下代码来方便理解:
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(this.name + "吃粮食!");
}
/**
* 在该类中,
* 编译器会自动添加 Animal this 这一参数
* 这也解释为什么可以使用 this
*/
public void get(Animal this, String a, int b) {
this.name = a;
this.age = b;
this.eat();
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
/**
* 当我们传参时,会将实例化对象animal传入
* 因此我们可以通过 .号前面的内容来判断给谁赋值
*/
animal.get("lisa",10);
System.out.println(animal.name + animal.age);
}
}
3.2 为什么要使用 this
我们先来看看以下代码:
答案明显不同,为什么会不同呢?因为第二种写法编译器无法区分左右两边的变量是实例化对象student的,还是参数的,所以默认两边都是参数,也就发生了参数自己给自己赋值,而我们最终要打印的是实例化对象student的成员变量,在我们调用的方法中成员变量没有被赋值,因此打印的是默认值。
为了防止第二种情况的发生,我们在JAVA中可以使用this来调用实例化对象的成员变量,例如:
结论:为了防止出现以上情况,我们在调用成员变量时,最好在前面加上 this .
四,构造方法
构造方法是用来给实例化对象赋值的一种方法,构造方法名必须与类名相同,且构造方法没有返回类型,格式如下:
class Animal{
public String name;
public int age;
//构造方法
Animal(){
System.out.println("1234");
}
}
当我们new一个对象时,一定会调用构造方法,也就是说每一类必须要有至少一个构造方法,细心的人可能会问,为什么上面的类当中没用构造方法也可以运行?那是因为如果没有定义构造方法,idea会自动添加一个无参的构造方法。
而当我们在一个类中写了多个构造方法,它们之间就会构成重载,例如:
class Student{
public String name;
public int age;
public Student(String name){
this.name = name;
}
public Student(int age){
this.age = age;
}
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
//调用一个参数的构造方法
Student student1 = new Student("lisa");
//调用两个参数的构造方法
Student student2 = new Student("lisa", 10);
}
}
补充一点:
this引用还可以在构造方法中以 this() 的形式使用,意为 调用本类中的其他构造方法,且this()必须放在构造方法的第一行,一个构造方法中只能有一个this(),例如:
class Student{
public String name;
public int age;
public Student(String name){
this(10);
this.name = name;
}
public Student(int age){
this.age = age;
}
}
总结重点
this的三种用法:
1. this.成员变量 来访问当前对象的属性,只能在类的方法中使用。
2.this.方法名 来访问当前对象的方法,只能在类的方法中使用。
3.this() 访问当前类中其他的构造方法,只能在构造方法内部使用,必须放在第一行,也就是说只能使用一次。