Java地基(六)----类和对象的解剖及this关键字

本文深入探讨了面向对象编程(OOP)的概念,包括类的抽象、对象的实例化、引用的理解以及内存管理。详细阐述了方法作为对象行为的体现,参数传递的两种方式——值传递和引用传递,并解析了this关键字在代码中的作用。通过实例解析,帮助读者理解OOP中的封装、继承和多态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. OOP :参杂了面向对象及函数式编程
  1. OOP 面向对象编程
  2. POP 面向过程编程
  3. 函数式编程:方法

封装(Encapsulation)、继承(inheritance)、多态(polymorphism),是面向对象编程中的基本特征,java语言也同样具有这三种特征。

2.类:很抽象,极度抽象

类似我有一万个闪光点,而面试官只看准了我一个闪光点,他用了我,实际上他拥有了我全部的闪光点

3.对象:万物皆对象

类是对象的抽象

对象是类的实例

4.引用:给对象起个名字,方便使用它

引用类型的变量,简称引用。
引用是可以指向对象的,简称引用指向对象。

5.内存

堆,栈,方法区

在这里插入图片描述

注意1,类加载过程,把Student.class文件内容加载到方法区中
注意2,main方法运行时,整个main方法的代码都被加载到栈区中
注意3,创建对象,给name属性赋值,这些操作的代码也在main方法中,但由于代码太长,图中标注到右边
注意4,根据类(相当于模板)创建出的对象,都是在堆区中
注意5,对象中的属性和方法,和类中定义的保持一致,因为对象就是根据类创建出来的。
注意6,对象是具体的,我们可以给它的属性赋一个具体的值,例如tom
注意7,引用stu在栈区中,它保存了这个对象在堆区中的地址(0x123),形象的描述为,引用指向对象。
注意8,=号赋值操作,其实就是把对象的内存地址,赋值给了引用stu
注意9,如果有需要,可以根据类,继续在堆区中,创建出其他具体的学生对象。

6. 方法:对象的行为

方法定义在类中,属于类的成员,所以也可以叫做成员方法。类似的,类中的属性,也可以称为成员变量

  • public、static、abstract、final等这些都属于修饰符,可以用来修饰方法、属性、类
  • 如果方法上有多个修饰符,这些修饰符是没顺序之分的
  • 只有一种特殊的方法没有返回类型,也不写void,那就是构造方法,也就是构造器
7. 参数传递

形参与实参进行区分:

值传递:将会在栈区域开辟两个空间,互不干扰,因此形参实参操作不同的

值传递,实参把自己存储的值(基本类型都是简单的数字)赋值给形参,之后形参如何操作,对形 参一点影响没有。
在这里插入图片描述

引用传递:虽然也会在栈区域开辟俩个空间,但其引用却都指向同一地址的堆空间,操作同一对象

由于引用传递,是实参将自己存储的对象地址,赋值给了形参,这时候俩个引用(实参和形参)指 向了同一个对象,那么任何一个引用(实参或形参)操作对象,例如属性赋值,那么另一个引用(形参或实参)都可以看到这个对象中属性的变量,因为俩个引用指向同一个对象。这个时候就相当于,俩个遥控器,同时控制同一台电视机
在这里插入图片描述

方法递归使用:return关键字退出方法可以类比break

int a = 1;
public void test(){
	//...
	a++;
	if(a==10){
		return;
		} 
	test();
	//...
}
8.this关键字:指当前类

this代表,所在类的当前对象的引用(地址值),即对象自己的引用。

类中的非静态方法,一定要使用类的对象来进行调用,没有其他的方式!

静态方法是可以在任何地方调用

使用场景:

  • 区别成员变量和局部变量
//=号左边的this.name,表示类中的属性name
//=号右边的name,表示当前方法的参数name(就近原则)
this.name = name;
  • 调用类中的其他方法
public class Student{
	public String name;
	public void setName(String name){
		this.name = name;
	}
	public void print(){
		//表示调用当前类中的setName方法
		this.setName("tom");
	}
}
  • 调用类中的其他构造器

    注意,this的这种调用构造器的用法,只能在类中的一个构造器,调用另一个构造器。并且不能在普通的方法中调用类的构造器。并且要求,this调用构造器的代码,是当前构造器中的第一句代码,否则编译报错

public class Student{
	public String name;
	public Student(){
		//调用一个参数的构造器,参数的类型是String
		this("tom");
	} 
	public Student(String name){
		this.name = name;
	}
}

在这里插入图片描述

可以看出,其实每一个对象中,都有自己的this,和其他对象中的互不影响。
当前执行stu1.sayHello()代码的时候,this代表的就是stu1
当前执行stu2.sayHello()代码的时候,this代表的就是stu2

记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值