Java 您所在的位置:网站首页 java里面的引用类型什么意思 Java

Java

2023-12-31 12:32| 来源: 网络整理| 查看: 265

目录

Java面向对象设计 - Java this关键字

一、什么是 this?

注意:

二、正式学习this关键字

1、this.调用本类属性,也就是类中的成员变量;用来区分成员变量和局部变量(重名问题)

2、this调用方法;用来访问本类的成员方法

3、this表示当前对象

Java面向对象设计 - Java this关键字 一、什么是 this?

Java有一个名为 this 的关键字。它是对类的当前实例的引用。它只能在实例的上下文中使用。(抽象懵逼中:实例又是什么?)

Java 实例是什么意思?

new 一个对象是实例吗? 答:对,是实例,你说的没错。可以把这个new出来的对象叫做实例,说白了就是这个new出来的“东东”,叫它对象也可以,叫它实例也可以,对象和实例在这个角度上来讲是等价的。

Java中使用 new关键字 加上 构造方法。来创建一个对象,下面是一个名为Cat的类

public class Cat { public Cat() { System.out.println("这是构造方法"); } }

那么使用  new + 构造方法 来创建一个对象,也就是

Cat c = new Cat(); Cat c 的意思是,在内存中分配一个变量,名字叫c,这个变量是Cat类型的,它的值是什么?一会儿在说;后半部分,new Cat(); 这就是new关键字和构造方法来创建一个对象,Cat()是构造方法的名字没错吧?想造出一个对象来,就这么写,语法规定的,没有为什么;new Cat(); 说明 new这个Cat类的一个对象,程序运行的时候,会调用构造方法Cat(),等这个构造方法执行完了,这个Cat类型的对象也就造出来了,真正的出现在内存当中了;使用new关键字造出来的对象,被分配在内存的堆区(heap),而且等这个对象真正出来之后,还会做一件重要的事情:我们这个对象是被分配在内存中的,那么内存地方大了,这个对象在哪里呢?怎么找到它呢?new关键字创建出一个对象之后,会把这个对象在内存中的地址返回,通过这个地址就可以找到这个对象,那么我们上面的写法,     Cat c = new Cat();意思就是说,把这个对象在内存中的地址 赋值 给变量c,这就是Java中引用概念,c就叫做引用,或者叫引用变量,或者直接叫变量,没问题,都是它;c的值就是一个内存地址,或者叫引用地址,通过这个地址,就可以准确的找到我们刚才创建出来的对象,以后我们要使用这个对象做一些事情,调用此对象的方法什么的,都用过这个引用。 注意:

我再说一遍,好多人都搞不清楚,这个c到底是对象还是引用,好多人说c就是Cat类的一个实例,这是非常错误的,c就是引用,不是对象!我们new出来的这个东西,真正在内存中的这个东西叫做对象,叫做实例。

new关键字详细见:https://blog.csdn.net/hewenqing1/article/details/103533113

 

二、正式学习this关键字

以下代码显示如何使用this关键字。

public class Main { int varA = 1; int varB = varA; int varC = this.varA; }

this关键字属于Java中比较复杂的关键字之一,若是学习过C++或者其他的一些面向对象语言也会遇到this这个关键字并且都会看到this的含义就是表示当前对象。(没学过也没关系)什么叫做表示当前对象?this在Java中的用法是怎样的呢?将分为下面几点介绍。

 

this调用本类属性this调用本类方法this表示当前对象 1、this.调用本类属性,也就是类中的成员变量;用来区分成员变量和局部变量(重名问题)

简单代码演示:

//定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(String n) { name = n; } //年龄获取值 public int getAge() { return age; } //年龄设置值 public void setAge(int a) { age = a; } } //测试类 class StudentTest { public static void main(String[] args) { //创建学生对象 Student s = new Student(); //给成员变量赋值 s.setName("小明"); s.setAge(24); //获取数据 System.out.println(s.getName()+"---"+s.getAge()); } }

输出:

小明---24

我们写参构造函数时,会倾向于将形参名取与将要赋值的属性名相同,这样就更容易看见形参就知道它是给哪个属性赋值。

起名字要做到见名知意。

在构造函数中赋值的时候,会很容易写成下面这样:(n改为name,a改为age)

//定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(String name) { name = name; } //年龄获取值 public int getAge() { return age; } //年龄设置值 public void setAge(int age) { age = age; } } //测试类 class StudentTest { public static void main(String[] args) { //创建学生对象 Student s = new Student(); //给成员变量赋值 s.setName("小明"); s.setAge(24); //获取数据 System.out.println(s.getName()+"---"+s.getAge()); } }

若写成这样,当构造Student这个对象并输出该对象的姓名和年龄时会发现,name为null, age为0。

null---0

造成这样的原因是因为有局部可见性。通常使用{}括起来的一个数据块叫做一个作用域范围。在同一个作用域范围定义了两个同名的变量则会报错;若是在该作用域定义了一个与该作用域范围之外同名的变量则是可以的,在这个作用域同时使用这两个变量,则在这个作用域中定义的变量会屏蔽作用域范围之外的那个变量,即作用域中定义的变量才会有效。 这样说完感觉有点绕。一句话来说,在同一作用域内,作用范围小的变量会屏蔽同名的作用范围大的变量。(就近原则)若是想要Student类中的属性可以被正确初始化,那么则需要使用this关键字。(调用本类属性)

//定义学生类 class Student { //姓名 private String name; //年龄 private int age; //姓名获取值 public String getName() { return name; } //姓名设置值 public void setName(String name) { //name = "小明"; //name = name; //变量的使用规则:就近原则 this.name = name; } //年龄获取值 public int getAge() { return age; } //年龄设置值 public void setAge(int age) { this.age = age; } } //测试类 class StudentTest { public static void main(String[] args) { //创建学生对象 Student s = new Student(); //给成员变量赋值 s.setName("小明"); s.setAge(24); //获取数据 System.out.println(s.getName()+"---"+s.getAge()); } } 小明---24

在我们编程时,访问类的属性最好使用this。

class Person{ private String name;//成员变量 private int age; Person(){} //默认,可以不写 Person(String name){//局部变量 this.name=name;//1.用"this.成员变量名称"和重名的局部变量区分开来 } Person(String name,int age){ this(name); this.age=age; } String getInfo(){//成员方法 return "姓名:" + name + "\n年龄:" + age; } void print(){ System.out.println(this.getInfo());//2.用"this.成员方法名"访问成员方法。 System.out.println(getInfo());//这种情况this关键字一般不写,让编译器自动添加。 } } public class Student2{ public static void main(String[] args){ Person p=new Person("张三",33); p.print(); } } 姓名:张三 年龄:33 姓名:张三 年龄:33

 

2、this调用方法;用来访问本类的成员方法

this不仅可以调用类中的属性还可以调用类中的方法。类中的方法

普通方法构造方法

普通方法和构造方法的区别:学习地址:https://blog.csdn.net/hewenqing1/article/details/103537880

在本类的普通函数中调用其他普通函数,可以在函数前面加上this也可以不加,但是为了代码严谨性推荐加上this。

普通方法中不可以调用构造函数,构造函数的调用只能出现在第一次创建对象为对象进行初始化时调用!在构造函数中调用普通方法,一般不推荐调用在方法内部使用了属性的普通方法。因为构造函数还没有执行完,属性没有被完全初始化,这时使用属性可能会出现异常。

构造函数之间可以相互调用,构造函数之间相互调用就一定需要使用this关键字!使用this();表示调用无参构造函数,this(参数,...);表示调用有参构造函数

this();     

访问本类的构造方法 ()中可以有参数的 如果有参数 就是调用指定的有参构造 

注意事项:

                 1.this() 不能使用在普通方法中, 只能写在构造方法中                   2.必须是构造方法中的第一条语句 示例代码:

public class Student{ private String name = null; private int age = 0; public Student() { System.out.println("Student():name="+name+",age="+age); } public Student(String name, int age) { this(); this.name = name; this.age = age; System.out.println("Student(String name, int age):name="+name+",age="+age); } public static void main(String[] args) { Student s = new Student("小明",20); } }

输出: 

Student():name=null,age=0 Student(String name, int age):name=小明,age=20 class Person{ private String name; private int age; Person(){} Person(String name){//不含this()的构造方法 this.name=name; } Person(String name,int age){//在构造方法内调用另一个构造方法 this(name);//"this();"访问构造方法必须放在构造方法的第一行 this.age=age; } String getInfo(){ return "姓名:" + name + "\n年龄:" + age; } void print(){ System.out.println(this.getInfo()); } } public class Student2{ public static void main(String[] args){ Person p=new Person("张三",33); p.print(); } }

输出: 

姓名:张三 年龄:33

构造函数之间相互调用有一些限制需要注意:

this()或者this(参数,...)需要被放在构造函数(方法)内部的首行进行构造方法相互调用的时候,一定要保留调用的出口! 至少保留相互调用之间的一个构造函数没有使用this调用其他构造函数,此构造函数作为出口。避免递归调用! 3、this表示当前对象 当前对象:当前正在调用方法的对象。

我们需要知道同一个类的对象它们的属性是属于不同空间的,但是这些对象是共享类中的方法。所以它们需要一种方式表明是它们自己在调用该方法而不是其他的对象。所以,当对象调用方法时,该对象会作为一个隐含实参传入到非静态方法中,在非静态方法中使用this来指向它,表明是它在调用该方法。this不能用于静态方法。main方法也是静态的(static 关键字声明),所以this也不能用于main方法。

扩展知识:

静态方法static(类方法)和 非静态方法(实例方法)的区别:

方法我们主要分为三种: 1.构造方法 2.非静态方法(普通方法/实例方法) 3.静态方法(类方法)

代码示例:当前对象,当前正在调用方法的对象。

如下,分别用两种方法打印对象per1和per2

// 定义Person类 class Person{ public String getInfo(){ // 取得信息的方法 System.out.println("Person类 --> " + this) ; // 直接打印this return null ; // 为了保证语法正确,返回null } } public class ThisDemo{ public static void main(String args[]){ Person per1 = new Person() ; // 调用构造实例化对象 Person per2 = new Person() ; // 调用构造实例化对象 System.out.println("main方法 --> " + per1) ; // 直接打印对象 per1.getInfo() ; // 当前调用getInfo()方法的对象是per1 System.out.println("main方法 --> " + per2) ; // 直接打印对象 per2.getInfo() ; // 当前调用getInfo()方法的对象是per2 } } main方法 --> Person@63961c42 Person类 --> Person@63961c42 main方法 --> Person@65b54208 Person类 --> Person@65b54208

this关键字的内存图解:

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有