先看看整体结构,接下来会逐层讲...
目录
================== 第一部分 ===================
================== 第二部分 ===================
================== 第三部分 ===================
1. this调用当前属性 -- this.data -> this代表当前对象的引用
2. this调用方法 -- 普通方法this.fun( ) 与 构造方法 this( )
=========== 第一部分 ============
一、定义类
类=属性+方法
假设定义一个学生类
属性:抽象出来的学生个体特征。比如学生姓名,性别,年龄...
方法:学生个体的行为。比如学生写作业,学生考试...
二、创建对象
先声明类(类中包含成员属性和方法) ,才能创建对象
注意:
先有类,才能有对象
student -> 对象的引用,new Student( ) -> 对象
创建对象即实例化对象,当我们实例化一个对象的时候,一定会存在两步(或者更多):
1. 为对象分配内存
2. 调用合适的构造方法
=========== 第二部分 ============
一、类 - 属性 - 成员变量初始化
① 就地初始化
② 类外初始化
操作对象,需要用到引用。即通过对象的引用操作对象
使用对象:引用.变量 or 引用.方法(对象的使用包括引用对象的成员变量和方法 )
③利用构造方法初始化
(接下来就讲,可以先去看,再返回来看这个) 使用构造方法进行初始化,十分方便,也利于简化代码
二、类 - 方法 - 普通方法与构造方法
方法包括:普通方法(简称方法)和构造方法
普通方法
定义:返回类型+方法名 ,类似于c语言中的函数
构造方法
定义:方法名和类名相同,且没有返回类型(两者缺一不可)
思考:回忆创建对象的过程,类名后加( ),这个( )是什么意思?
创建对象时的new Student ( ),可以简单看成由new Student 和Student( )两部分组成。
① new Student是在创建对象并给对象分配空间
② Student( )调用系统默认的不带参数的构造方法
题外话:要求方法名跟类名相同,就是为了Student( )实现构造方法的调用...
当程序中我们没有写构造方法时,编译器会为我们提供一个不带参数的构造方法;
如果我们写上了构造方法,编译器就不会再为我们默认生成一个不带参数的构造方法
注意:
构造方法可以有多个,多个构造方法形成重载
new对象时,括号内应与调用的构造方法的参数匹配
这里只简单提到构造方法,它还有更妙的使用情况,接下来我们在初始化还会见到它...
=========== 第三部分 ============
this的三种用法
1. this调用当前属性 -- this.data -> this代表当前对象的引用
看下图:Student类中和方法set中,都存在变量name、age、score。在以下代码中,this就表示当前对象new student( )的引用student
思考1:如果赋值时不加this引用,程序将报错,这是为什么?
原因:成员变量与局部变量同名时,在set方法中进行的操作只是对局部变量name,age,score 进行了赋值,但并没有改变成员变量的值
只有加上this,程序才能确定 -> 左值是成员变量,右值是形参
思考2:在下图中,编译器是怎么确定student1的成员变量和student2的成员变量的呢?
实际上,平时的代码中编译器省略了this
还原编译器隐藏的成员方法参数如下图
谁引用了对象的方法,谁就是this当前对象的引用:
当前是student1引用了setdate方法,所以这里的this相当于student1
this.name <==> student1.name
2. this调用方法 -- 普通方法this.fun( ) 与 构造方法 this( )
this.fun( ) -> 调用本类中其他方法
this( ) -> 调用本类中的其他合适的构造方法
注意:
只有在构造方法中才能使用this( )
使用this( )语句,必须放在第一行
使用场景:
1. 当需要使用构造方法输出同一重复内容时,若不使用this关键字,则只能使用如下代码:
class Student{ public String name; public int age; public Student(){ System.out.println("=====个人信息表====="); } public Student(String name){ System.out.println("=====个人信息表====="); this.name=name; } public Student(String name,int age){ System.out.println("=====个人信息表====="); this.name=name; this.age=age; } public void print(){ System.out.println("名字:"+name+" "+"年龄:"+age); } } public class Cclass { public static void main(String[] args) { Student student1=new Student("李明",18); student1.print(); } }
显然,这样大大浪费了代码行数,而应该使用this进行构造方法的调用,方法如下:
class Student{ public String name; public int age; public Student(){ System.out.println("=====个人信息表====="); } public Student(String name){ this(); this.name=name; } public Student(String name,int age){ this(name); this.age=age; } public void print(){ System.out.println("名字:"+name+" "+"年龄:"+age); } } public class Cclass { public static void main(String[] args) { Student student1=new Student("李明",18); student1.print(); } }
2. 是一种设计思想,部分源码实现有用到:
以上构造方法,不论用户输入的是几个参数,内部实现都将调用两个参数的构造方法初始化