类和对象上
面向对象的初步认识
什么是面向对象
java就是一门面向对象语言,在对象的世界,一切皆是对象,面向对象是解决问题的一种思想,依靠对象之间的交互完成任务.
面向对象与面向对象的过程
例如传统洗衣服过程,注重的是洗衣服的过程,缺一不可,不同衣服洗涤方式,时间,处理方式都不同,很麻烦;
现代洗衣服,以面向对象方式来进行处理,就不关注洗衣服的过程,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。
类定义与使用
简单认识类
类是用来对一个实体(对象)进行描述的,描述该实体有哪些属性,那些功能,描述完计算机就可以开始识别了
类的定义格式
在Java中定义类需要用到class关键字,具体语法如下:
创建类
class ClassMate{
field //成员变量
method //成员方法
}
class为定义类的关键字,ClassMate为类的名字,{}为类的主体.
类中包含的内容为类的成员,属性主要用来描述类,称为类的成员属性或变量,方法说明有哪些功能,称为类的成员方法…
注意事项
- 类名采用大驼峰定义
- 成员前统一写法为public
- 方法不带关键字static
如何去定义一个类
class Animal{
int age;
String name;
public void eat(){
System.out.println(name+"饿了要吃饭");
}
}
定义一个动物类
注意
- 一般一个文件中只定义一个类
- main方法所在的类会用public修饰
- public修饰的类必须和文件名相同
- 不要轻易去改public修饰的类
类的实例化
什么是类的实例化
定义了一个类,相当于在计算机定义一个新的类型,如int,double,不过他们是Java自带的内置类型,类是用户自定义了一个新的类型,有了这些自定义的类,就可以实例对象.
用类类型创建对象的过程,成为类的实例化,java经常使用new配合类名实例化对象.
注意
1.new关键字用于创建一个对象的实例
2.使用 . 来访问对象中方法和属性
3.同一个类可以实例多个对象
类和对象说明
- 类只是一个模型,用于对一个实体进行描述,限定了类有哪些成员.
- 类是一个自定义类型,可以定义多个变量
this引用
为什么会有this引用
我们可以看一个例子:
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 d3
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
}
我们会发现以下疑问:
形参名字和成员变量相同
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
那么到底是谁给谁赋值呢,让我们用this来揭开这一层神秘的面纱.
什么是this引用
this引用指向当前对象,在成员方法中所有成员变量的操作都是通过this引用来访问.
public void setDay(int y, int m, int d){
this.year = y;
this.month = m;
this.day = d;
}
this引用是的调用成员的对象.
this引用的特性
- this的类型:对应类的引用,对象调用哪个就是那个对象的引用类型
- this只能在成员方法中使用
- this只能引用当前对象
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
对象的构造和初始化
如何初始化对象
我们知道在Java内部定义一个局部变量需要初始化,不然会编译失败
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要让代码通过编译即在使用a之前给a一个初始的值
如果是对象:
public static void main(String[] args) {
Date d1 = new Date();
}
我们可以发现以下问题:
每一次对象创建好要一次次设置具体日期,我们该如何初始化对象
局部变量要初始化才能使用,为什么字段声明没有值依旧可以使用
构造方法
概念
是一个特殊的成员方法,名字要和类名相同,创建对象由编译器调用,在整个对象生命周期只调用一次.
构造方法就是对对象的成员进行初始化,不会去开辟空间.
特性
- 名字要和类名相同
- 没有返回值类型,void也不可以
- 创建对象由编译器自动调用,在对象的生命周期只调用一次
- 构造方法可以重载
class Animal{
int age;
String name;
public Animal(){
this.age = age;
this.name = name;
}
//无参数的构造方法
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
//带有两个参数的构造方法
}
上面两个构造方法,名字相同,参数列表不同,构成了方法的重载
5. 如果用户没有定义,编译器会自动生成一份不带参数的构造方法.
注意:一旦用户定义,编译器将不再自动生成
6. 可以通过this调用其他方法简化代码
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){
//System.out.println(year); 注释取消掉,编译会失败
this(1900, 1, 1);
//this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
注意:this()必须是构造方法第一条语句;不可以形成环,会一直递归,死循环
public Date(){
this(1900,1,1);
}
public Date(int year, int month, int day) {
this();
}
- 大部分情况下用public修饰,有的用private
默认初始化
为什么局部变量需要初始化,但是成员变量不需要给定初始值就可以直接去使用
要搞清楚,我们要知道new关键字背后发生的一些事情:
Date d = new Date(2023,8,8);
在程序层面就只是一条简单的语句,在JVM要做许多事情:
- 检测对象对应的类是否发生了加载,没有需要加载,
- 为对象分配内存空间
- 处理并发问题
- 初始化所分配的空间
调用构造方法,给对象成员赋值
就地初始化
在声明成员变量就完成了初始化,给定了初始值
public class Date {
public int year = 2023;
public int month = 8;
public int day = 8;
public void setDay(int y, int m, int d) {
year = y;
month = m;
day = d;
}
public void printDate() {
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
Date d1 = new Date();
}
}
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中