目录
🍑1.前言
要学习类和对象,首先要了解面向对象和面向过程的区别,Java和C++就是面向对象的语言。我个人的理解:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。(可理解为微观角度)
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。(可理解为宏观角度)
🍑2.类的定义
类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。必须先定义出一个类,我们才能实例出对象。
🍎2.1定义一个类
当我们定义了一个类,就相当于在计算机中定义了一种新的类型,与int和double相似,只不过int和double是计算机中自带的内置类型,而类是由用户自定义的。
再定义类名时使用大驼峰,给大家看一下基本的语法
class ClassName{
//成员变量
//成员方法
}
可能这样还不是很清楚,我们举一只小狗的例子,一起来定义一个小狗的类。我们都知道小狗有很多类型,名字不同,年龄不同,颜色也不同,这些就是我们的成员变量。小狗有很多种技能,有的能摇尾巴,有的能旺旺叫
class Dog {
//1、字段/属性【成员变量】:类的内部 方法的外部
public String name;//名字
public int age;//年龄
public String color;//颜色
//2、行为 / 方法【成员方法】
public void wag() {//摇尾巴
System.out.println(name+" 摇尾巴!");
}
public void bark() {//旺旺
System.out.println(name+" 旺旺!");
}
}
在Java的开发过程中,一般一个Java文件只写一个类。
🍎2.2类产生对象
我们通常将类产生对象的过程称为实例化,那有了类我们要如何产生对象呢?
最简单的方法就是用new语句来产生一个对象(也就是我们常说的new一个对象)
Dog dog = new Dog();
Dog dog2 = new Dog();
创建成功后,会在栈上开辟一块内存给 dog,它会存入堆的一块地址,之后我们便可以对对象中的属性进行赋值
public static void main(String[] args) {
//通过new关键字 实例化了一个对象
Dog dog = new Dog();
dog.name = "郑立群";
dog.color = "白色";
dog.age = 2;
dog.wag();
dog.bark();
dog.show();
Dog dog2 = new Dog();
dog2.name = "大漠叔叔";
dog2.age = 44;
dog2.color = "黑色";
dog2.show();
Dog dog3 = new Dog();
Dog dog4 = new Dog();
//通过一个类 可以实例化 多个对象
}
🍑3.this引用
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。(也就是说只能在成员方法中使用)只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
public class Date {
int year;
int month;
int day;
public void setDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate() {
System.out.println(this.year+" "+this.month+" " + this.day);
}
public static void main(String[] args) {
Date date1 = new Date();
date1.setDate(2020,5,8);
date1.printDate();
Date date2 = new Date();
date2.setDate(2021,5,8);
date2.printDate();
Date date3 = new Date();
date3.setDate(2022,5,8);
date3.printDate();
}
}
也就是说this是指向我们的对象Date。
这里找到了其他人写的this有关的资料,放出来供大家参考
this关键字:
关键字,代表当前类对象
可以代表当前类还没有产成的对象,代表当前类刚创建的对象,代表当前正在使用的对象,this是灵活的指代,是虚拟的,可以指代当前类正在活动的对象
当一个类被创建的时候,java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this,
因为this在对象创建的时候才有,所以this只能在类中的非静态方法中使用,静态方法和静态代码块中绝对不能出现this,因为静态资源和类关联,this和类对象关联,所以不同的对象不同的this,this指针是灵活的指代地址,最初始没有地址的是虚拟的
this语句–在同一个类中的构造方法里调用其他别的构造方法—必须要在首行----this(参数)
this可以调用其他的非构造方法,this.m();
由于子类可以获取父类的属性,所以this也可以在子类中出现调用父类的方法,一个类中可以出现多个this语句
this只能出现在方法中,作为变量的应用调用其他资源
this.用于创建对象的时候进行属性的初始化,用于指定自身,方法调用的对象可以是this
🍑 4.对象的构造和初始化
🍎 4.1初始化变量
在Java方法内部定义一个局部变量时,必须要初始化,否则会编译错误。
🍎4.2对象的构造
实例化一个对象分为两步:1. 为这个对象分配内存 2. 调用合适的构造方法
构造方法不止一个,对象的生成一定会构造方法。再构造这个对象的时候也可以给定一些默认值。构造的方法名字与类相同,没有返回值类型,一般情况下用public修饰。
如果没有给它赋值,那么这个函数就会帮你将数字初始化为0
❤️4.2.1没有参数的构造方法
public Date() {
this.year = 1992;
this.month = 9;
this.day = 0;
System.out.println("不带参数的构造方法!");
}
❤️4.2.2带有参数的构造方法
public Date(int year,int month,int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用带有3个参数的构造方法!");
}
可以传参进入这个方法,来给对象赋值。
这两种方法可以同时存在,在构造第二种方法的时候,就生成了方法的重载。
方法的重载:1. 方法名相同 2. 参数列表不同:个数,类型,顺序 3.和返回值无关
如果用户没有显示定义,编译器会形成一套默认的构造方法,生成默认的构造方法一定是无参的。
对于成员的赋值:👇
1.定义字段的时候,同时初始化-->就地初始化
2.不初始化--> 0
3.在类外,通过对象的引用直接赋值。dog.name = "haha";
4.通过构造方法初始化