(一)this和super关键字
Ⅰ this
①含义:
this:当前对象
-
在构造器和非静态代码块中,表示正在new的对象
-
在实例方法中,表示调用当前方法的对象
②this用法:
-
this.成员变量:表示当前对象的某个成员变量,而不是局部变量
-
this.成员方法:表示当前对象的某个成员方法,完全可以省略this.
-
this()或this(实参列表):调用另一个构造器协助当前对象的实例化,只能在构造器首行,只会找本类的构造器,找不到就报错
Ⅱ super
①含义:
super:引用父类声明的成员
无论是this和super都是和对象有关的。
②super的用法:
-
super.成员变量:表示当前对象的某个成员变量,该成员变量在父类中声明的
-
super.成员方法:表示当前对象的某个成员方法,该成员方法在父类中声明的
-
super()或super(实参列表):调用父类的构造器协助当前对象的实例化,只能在构造器首行,只会找直接父类的对应构造器,找不到就报错
Ⅲ this和super关键字的用处
⒈解决成员变量重名问题
具体做法:
-
① 如果实例变量与局部变量重名,可以在实例变量前面加this.进行区别。
-
② 如果子类实例变量和父类实例变量重名,并且父类的该实例变量在子类仍然可见,在子类中要访问父类声明的实例变量需要在父类实例变量前加super.,否则默认访问的是子类自己声明的实例变量。
-
③ 如果父子类实例变量没有重名,只要权限修饰符允许,在子类中完全可以直接访问父类中声明的实例变量,也可以用this.实例访问,也可以用super.实例变量访问。
具体代码:
class Father{
int a = 10;
int b = 11;
}
class Son extends Father{
int a = 20;
public void test(){
//子类与父类的属性同名,子类对象中就有两个a
System.out.println("子类的a:" + a);//20 先找局部变量找,没有再从本类成员变量找
System.out.println("子类的a:" + this.a);//20 先从本类成员变量找
System.out.println("父类的a:" + super.a);//10 直接从父类成员变量找
//子类与父类的属性不同名,是同一个b
System.out.println("b = " + b);//11 先找局部变量找,没有再从本类成员变量找,没有再从父类找
System.out.println("b = " + this.b);//11 先从本类成员变量找,没有再从父类找
System.out.println("b = " + super.b);//11 直接从父类局部变量找
}
public void method(int a, int b){
//子类与父类的属性同名,子类对象中就有两个成员变量a,此时方法中还有一个局部变量a
System.out.println("局部变量的a:" + a);//30 先找局部变量
System.out.println("子类的a:" + this.a);//20 先从本类成员变量找
System.out.println("父类的a:" + super.a);//10 直接从父类成员变量找
System.out.println("b = " + b);//13 先找局部变量
System.out.println("b = " + this.b);//11 先从本类成员变量找
System.out.println("b = " + super.b);//11 直接从父类局部变量找
}
}
class Test{
public static void main(String[] args){
Son son = new Son();
son.test();
son.method(30,13);
}
}
总结:
-
变量前面没有super.和this.
-
在构造器、代码块、方法中如果出现使用某个变量,先查看是否是——当前块——声明的 局部变量 ,
-
如果不是局部变量,先从当前执行代码的 本类去找成员变量
-
如果从当前执行代码的本类中没有找到,会往上找——父类声明的成员变量 (权限修饰符允许在子类中访问的)
-
-
变量前面有this.
-
通过this找成员变量时,先从当前执行代码的——本类去找成员变量
-
如果从当前执行代码的本类中没有找到,会往上找——父类声明的成员变量(权限修饰符允许在子类中访问的)
-
-
变量前面super.
-
通过super找成员变量,直接从当前执行代码的直接父类去找成员变量(权限修饰符允许在子类中访问的)
-
如果直接父类没有,就去父类的父类中找(权限修饰符允许在子类中访问的)
-
⒉ 解决成员方法重写后调用问题
具体做法:
-
如果子类没有重写父类的方法,只有权限修饰符运行,在子类中完全可以直接调用父类的方法;
-
如果子类重写了父类的方法,在子类中需要通过super.才能调用父类被重写的方法,否则默认调用的子类重写的方法
具体代码:
class Father{
int a = 10;
int b = 11;
public int getA() {
return a;
}
}
class Son extends Father{
int a = 20;
public int getA() {
return a;
}
public void test(){
System.out.println(getA());//10 本类没有找父类,执行父类中的getNum()
System.out.println(this.getA());//10 本类没有找父类,执行父类中的getNum()
System.out.println(super.getA());//10 本类没有找父类,执行父类中的getNum()
}
}
class Test{
public static void main(String[] args){
Son son = new Son();
son.test();
/* 20
20
10 */
}
}
总结:
-
方法前面没有super.和this.
-
先从子类找匹配方法,如果没有,再从直接父类找,再没有,继续往上追溯
-
-
方法前面有this.
-
先从子类找匹配方法,如果没有,再从直接父类找,再没有,继续往上追溯
-
-
方法前面有super.
-
从当前子类的直接父类找,如果没有,继续往上追溯
-
(二)final关键字
final(最终的,不可更改的 ),在java中final可修饰类(表示这个类不能被继承,没有子类 ),方法(表示这个方法不能被子类重写 ),变量(final修饰某个变量(成员变量或局部变量),表示它的值就不能被修改,即常量,常量名建议使用大写字母)。
为什么用final关键字呢?:不想让你继承。
具体代码:
class Test {
public static void main(String[] args){
final int MIN_SCORE = 0;
final int MAX_SCORE = 100;
MyDate m1 = new MyDate();
System.out.println(m1.getInfo());
MyDate m2 = new MyDate(2022,2,14);
System.out.println(m2.getInfo());
}
}
final class MyDate{
//没有set方法,必须有显示赋值的代码
private final int year;
private final int month;
private final int day;
public MyDate(){
year = 1970;
month = 1;
day = 1;
}
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
public String getInfo(){
return year + "年" + month + "月" + day + "日";
}
}
//public class CC extends MyDate{} Cannot inherit from final 'MyDate'
(三)native关键字
①定义:
native(本地的),在Java中native只能修饰方法,表示这个方法的方法体代码不是用Java语言实现的,而是由C/C++语言编写的。但是对于Java程序员来说,可以当做Java的方法一样去正常调用它,或者子类重写它。
②用途:
它只能用在一个地方,方法的返回值类型前面,作为方法的一个修饰符。
③作用:
用它修饰方法,在.java中看不到这个方法的方法体。
④语法形式:
【修饰符】 class 类名{
【权限修饰符】 native 返回值类型 方法名 (【形参列表】);文章来源:https://www.toymoban.com/news/detail-406479.html
}文章来源地址https://www.toymoban.com/news/detail-406479.html
class Test {
public static void main(String[] args){
Test t=new Test();
System.out.println(t.hashCode());//同时按Ctrl+点击hashCode ->查看hashCode的源码
}
}
到了这里,关于Java ---一些关键字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!