当前位置: 首页 > Web前端 > HTML

【java】this,超级关键字,代码块介绍

时间:2023-03-28 00:46:33 HTML

文章目录1.this引用1.this引用介绍即用户看不到这个参数,但是用户可以使用这个参数。this引用指向当前对象(成员方法运行时调用成员方法的对象),成员方法中的所有成员变量操作都是通过this引用访问的。只是所有的操作对用户都是透明的,即用户不需要传递,编译器自动完成。this指的是在其上调用成员方法的对象。2、this引用的特点this的类型:对应的类类型引用,即调用哪个对象就是哪个对象的引用类型this只能用在“成员方法”中。在“成员方法”中,this只能引用当前对象,不能引用其他对象。这是“成员方法”的第一个隐藏参数,编译器会自动传递给它。执行成员方法时,编译器会负责将调用成员方法的对象的引用传递给成员方法,而this负责接收,用户也可以手动给编译器实现的形参this,但是实参不能有对应对象的引用,否则会报错。3.这个引用解决的问题如下面给出的代码所示。成员变量的名称与成员变量的名称相同;但是我们并没有通过这个引用手动调用成员变量;查看执行结果,可以发现此时成员变量的赋值还没有完成,因为该方法遵循局部变量优先的原则,不会去访问成员变量,只是给形式参数本身。公共课日期{公共整数年;公共月份;公众日;publicvoidsetDay(intyear,intmonth,intday){year=year;月=月;日=日;}publicvoidprintDate(){System.out.println(year+"/"+month+"/"+day);}publicstaticvoidmain(String[]args){//构造三个日期类型为d1d2d3的对象Dated1=newDate();日期d2=新日期();日期d3=新日期();//设置d1.setDay(2022,8,15为d1,d2,d3的日期);d2.setDay(2022,8,16);d3.setDay(2022,8,17);//打印日期内容d1.printDate();d2.printDate();d3.printDate();}}执行结果:解决这里的问题,只需要通过this访问成员变量,就可以区分形参和成员变量CreatedpublicvoidsetDay(intyear,intmonth,intday){this.year=年;这个月=月;this.day=day;}执行结果:4.this的三种用法。成员变量this。成员方法this();构造函数的访问(在构造函数博客中有介绍)二、super关键字1、super关键字的介绍由于设计不佳或者场景的需要,子类和父类中可能存在同名如果你想在子类的方法中访问父类的同名成员,怎么办?直接访问是不可能的,因为部分优先原则,子类的成员会被直接访问。Java提供了super关键字。this关键字的主要作用是在子类的方法中访问父类的成员。【注意事项】super只能用在非静态方法中。super可以在子类方法中使用,以访问父类的成员变量和方法。publicclassBase{inta;intb;publicvoidmethodA(){System.out.println("methodA()inBase");}publicvoidmethodB(){System.out.println("methodBinBase()");}}classDerivedextendsBase{inta;//与父类中的成员变量同名同类型charb;//与父类中成员变量同名但类型不同//同methodA(父类中)形成重载publicvoidmethodA(inta){System.out.println("method()methodinDerived");}//和基类中的methodB()形成重写publicvoidmethodB(){System.out.println("methodB()methodinDerived");}publicvoidmethodC(){//对于同名成员变量,直接访问时,都是访问子类的a=100;//等价于:this.a=100;b=101;//等价于:this.b=101;//注意:this是当前对象的引用//访问父类的成员变量时,需要使用super关键字//super是获取的部分继承自子类对象中的基类super.a=200;super.b=201;//父类和子类中重载的方法可以区分,直接通过参数列表访问父类或子类方法methodA();//无参数,访问父类methodA(20)中的methodA();//传递int参数,访问子类中的methodA(int)//如果在子类中要访问重写的基类方法,需要使用super关键字methodB();//直接访问,总会在子类中访问methodA(),基类无法访问super.methodB();//访问基类的methodB()}}2。supersuper的三种用法。子类super中继承父类的成员变量。子类中继承父类的成员方法super();调用父类的构造方法(在构造方法博客中有介绍)3.super和this的比较1.相同点是Java中的关键字只能用在类的非静态方法中,访问非静态成员方法和字段。在构造方法中调用时,必须是构造方法中的第一个语句,并且不能同时存在2.区别this是当前对象的引用,当前对象是调用实例方法的对象,super相当于在子类对象中对父类继承的一些成员的引用(注意不是父类的引用,子类继承父类并不会创建父类对象)在非静态成员方法,this用于访问本类的方法和属性,如果子类对象中没有重名,this也可以用来访问从父类继承的方法和属性;但是super只能用来访问继承自父类的方法和属性在构造方法中:this(...)用于调用本类的构造方法,super(...)用于调用父类构造方法,这两个调用不能同时出现在构造方法中。子类构造方法中必须有super(...)调用,用户不写编译器会自动给;但必须在子类的构造方法中调用子类的其他构造方法,需要用户手动添加this(...)4.代码块概念及分类用{}定义的一段代码称为代码块。根据代码块定义的位置和关键字,可以分为以下四种类型:普通代码块构造代码块静态代码块同步代码块1.普通代码块normalcodeblock:定义在方法,里面的变量只在代码块中有效,这种用法很少见。publicclassMain{publicstaticvoidmain(String[]args){{//直接用{}定义,公共方法块intx=10;System.out.println("x1="+x);}整数x=100;System.out.println("x2="+x);}}2。构造代码块类中定义的代码块(不带修饰符)。也称为:实例代码块。构造代码块一般用于初始化实例成员变量。publicclassStudent{//实例成员变量privateStringname;私有字符串性别;私人年龄;//实例代码块{this.name="xinxin";这个年龄=21;this.gander="nan";System.out.println("我是实例init()!");}publicvoidshow(){System.out.println("姓名:"+姓名+"年龄:"+年龄+"性别:"+性别);}}publicclassMain{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.show();}}3。静态代码块使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。公共课学生{私人字符串名称;私人年龄;私有静态字符串类房间;//实例代码块{this.name="xin";这个年龄=21;System.out.println("我是实例init()!");}//静态代码块static{classRoom="rj2104";System.out.println("我是静态init()!");}publicstaticvoidmain(String[]args){Students1=newStudent();学生s2=新学生();}}4.注意事项静态代码块中无论生成多少个对象,都只会执行一次。静态成员变量是类的属性,所以在JVM加载类时会开辟空间并初始化如果一个类包含多个静态代码块,在编译代码时,编译器会依次执行(合并)实例代码块按照定义的顺序,只有在创建对象时才会执行