Java中的类和对象

1、什么是对象?

对象是一个实体,我们可以将洗衣服的过程举例说明:
洗衣服时,对象是洗衣机、洗衣粉、人、衣服;过程是人将衣服放进洗衣机,倒入洗衣粉,启动洗衣机,洗衣机完成洗衣过程并进行甩干。
在整个过程中,人、洗衣机、衣服、洗衣粉四个对象之间完成的,人不需要关注洗衣机是如何洗衣服的,这就是对象和过程的区别。

2、类的定义和使用

类是对一个对象进行描述的,在Java中定义类需要用到class关键字,具体语法如下:

//创建类
class PetDog{
//属性或者成员变量
	public String name;//名字
	public string color;//颜色
//行为或者成员方法
	public viod barks(){
		System.out.println(name+"汪汪汪~");
	}
	public viod wag(){
		System.out.println(name+"摇尾巴~");
	}
}

注意事项:

  • 类名采用大驼峰定义
  • 成员前写法统一为piblic
  • 此处的方法不带static关键字

3、类的实例化

自定义一个类,与int、double相似,他们都是类。用类创建对象的过程,就是类的实例化,在Java中采用new关键字,配合类名实例化对象。举例说明:

public class Main{
	public static void main(String[] args) {
		PetDog dogh = new PetDog(); //通过new实例化对象
		dogh.name = "阿黄";
		dogh.color = "黑黄";
		dogh.barks();
		dogh.wag();
		
		PetDog dogs = new PetDog();
		dogs.name = "阿黄";
		dogs.color = "黑黄";
		dogs.barks();
		dogs.wag();
	}
}
输出结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~

注意事项:

  • new关键字用于创建一个对象的实例
  • 使用.来访问对象中的属性和方法
  • 同一个类可以创建多个实例

4、this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该
引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
注意:this引用的是调用成员方法的对象。
this引用的特性:

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
  2. this只能在"成员方法"中使用
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
    对象的引用传递给该成员方法,this负责来接收

5、对象方法的构造及初始化

在Java的方法内部定义一个局部变量时,必须初始化,否则编译失败。
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

public class Date {
	public int year;
	public int month;
	public int day;
	
	// 构造方法:
	// 名字与类名相同,没有返回值类型,设置为void也不行
	// 一般情况下使用public修饰
	// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
	public Date(int year, int month, int day){
		this.year = year;
		this.month = month;
		this.day = day;
		System.out.println("Date(int,int,int)方法被调用了");
	}

	public void printDate(){
		System.out.println(year + "-" + month + "-" + day);
	}
	
	public static void main(String[] args) {
		// 此处创建了一个Date类型的对象,并没有显式调用构造方法
		Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
		d.printDate(); // 2021-6-9
	}
}

注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

6、构造方法的特性

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {
	public int year;
	public int month;
	public int day;

	// 无参构造方法
	public Date(){
		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;
	}

	public void printDate(){
		System.out.println(year + "-" + month + "-" + day);
	}

	public static void main(String[] args) {
		Date d = new Date();
		d.printDate();
	}
}

上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。

  1. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
public class Date {
	public int year;
	public int month;
	public int day;

	public void printDate(){
		System.out.println(year + "-" + month + "-" + day);
	}

	public static void main(String[] args) {
		Date d = new Date();
		d.printDate();
	}
}

上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
注意:一旦用户定义,编译器则不再生成。

public class Date {
	public int year;
	public int month;
	public int day;

	public Date(int year, int month, int day) {
		this.year = year;
		this.month = month;
		this.day = day;
	}
	
	public void printDate(){
		System.out.println(year + "-" + month + "-" + day);
	}	

	public static void main(String[] args) {
		// 如果编译器会生成,则生成的构造方法一定是无参的
		// 则此处创建对象是可以通过编译的
		// 但实际情况是:编译期报错
		Date d = new Date();
		d.printDate();
	}
}

/*
Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;
需要: int,int,int
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
*/
  1. 构造方法中,可以通过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();
}

/*
无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用
编译报错:Error:(19, 12) java: 递归构造器调用
*/
  1. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰

7、初始化

默认初始化的初始值

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
引用类型null

就地初始化:在声明成员变量时,就直接给出了初始值。

public class Date {
	public int year = 1900;
	public int month = 1;
	public int day = 1;

	public Date(){
	}

	public Date(int year, int month, int day) {
	}

	public static void main(String[] args) {
		Date d1 = new Date(2021,6,9);
		Date d2 = new Date();
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

营养快线好喝~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值