目录
一、this关键字
1、定义:
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
2、用法
(1)this修饰属性,当前对象中的属性
(2)this修饰方法名,当前对象的方法
(3)this()
注意:
1、只能在构造方法中通过this来调用其他构造方法,普通方法中不能使用。
2、不能通过this递归调用构造方法,即不能在一个构造方法中通过this直接或间接调用该构造方法本身。
3、通过this调用其他构造方法必须放在构造方法的第一行中执行。
4、由于super调用父类的构造函数也必须放在构造方法的第一行中执行,因此,通过this和super调用构造方法不能同时出现一个构造方法中。也不能在一个构造方法中多次调用不同的构造方法。
如果两个构造方法通过this互相调用,就会出现循环。举例:
public class Test {
public static void main(String[] args){
Student student1 = new Student();
student.run("11111");
Student student2 = new Student();
student.run("22222");
}
}
public class Student {
public String name;
public void run(String aaa){
this.name = aaa; //=赋值操作,前为变量后为值
}
}
注意:
static修饰的代码当中不能出现this关键字,因为类是构建对象的模板,没有对象。而this可以调用static修饰的方法,static修饰的代码被所有对象共享。
public class Student {
public String name;
public static void run(String name){
this.name = name; //这里出现报错,static中出现this
}
public void aaa(){
this.run("1111"); //this可以调用static修饰的方法
}
}
使用this方法处理变量名的歧义性
在Java中,不允许在范围(类范围或方法范围)内声明两个或多个具有相同名称的变量。但是,实例变量和参数可能具有相同的名称。
class M {
// 实例变量
int age;
// 参数
M(int age){
age = age;
}
}
在上面的程序中,实例变量和参数具有相同的名称:age。在这里,由于名称不明确,Java编译器感到困惑。在这种情况下,我们使用this关键字。
二、final关键字
在Java中,final关键字用于表示常量。它可以与变量,方法和类一起使用。下面就从这三个方面进行讲解
1、final修饰变量
全局变量和局部变量
对于全局和局部变量来说:成员变量在声明时必须被赋值,局部变量声明时可以不赋值,当局部变量被第一次赋值以后,不能二次赋值
举例:
public class Student {
public final String name; //这里报错,全局变量必须要赋初始值
public void inf(){
public final int age; //可以不赋值,但第一次赋值后不可更改
}
}
class Main {
public static void main(String[] args) {
//创建一个final变量
final int AGE = 32;
//尝试更改final变量
AGE = 45;
System.out.println("Age: " + AGE);
}
}
基本数据类型和引用数据类型
对于基本数据类型所定义的变量和引用类型所定义的变量来说:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
举例:
public class A{
final int[] arr1 = new int[]{1,2,3};
final int[] arr2 = new int[]{2,3,4};
int a = 10;
public void run(){
a = 11; //这里报错,final修饰后基本数据类型不能被赋值第二次
}
public void change(){
arr1 = arr2; //这里报错,final修饰后引用类型的地址不能改变
}
public void change1(){
arr1[2]=10; //这里没有问题,没有改变地址,改变的是地址所在对象的值
}
}
2、final修饰方法
final修饰方法不能被重写
class Person{
String name;
int age;
final void show(){
System.out.println("person...");
}
}
class Student extends Person{ //报错,final修饰的方法不能被覆写
void show(){
System.out.println("student...");
}
}
注:类的private方法会隐式地被指定为final方法。
3、final修饰类
final修饰的类不能被继承
//final修饰的类不可以被继承
final class Person
{
String name;
int age;
}
class Student extends Person{ //这里报错,子类无法继承被final修饰的父类
}