您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

day11_static关键字丶this关键字丶super关键字

static关键字

static是一个修饰符,可以修饰:

  • 成员变量,我们称为类变量,或静态变量,表示某个类的所有对象共享的数据
  • 成员方法,我们称为类方法,或静态方法,表示不需要实例对象就可以调用的方法,使用“类名."进行调用
    • 父类的静态方法可以被继承不能被重写
    • 父接口的静态方法不能被实现类继承
  • 代码块,我们称为静态代码块,或静态初始化块,用于为静态变量初始化,每一个类的静态代码块只会执行一次,在类第一次初始化时执行
  • 成员内部类,我们称为静态成员内部类,简称静态内部类,不需要外部类实例对象就可以使用的内部类,在静态内部类中只能使用外部类的静态成员。static不能修饰top-level的类

this关键字

this含义

Java 中, this 关键字比较难理解,它的作用和其词义很接近。
  • 它在方法内部使用,即这个方法所属对象的引用;
  • 它在构造器内部使用,表示该构造器正在初始化的对象。

this使用位置

  • this在实例初始化相关的代码块和构造器中:表示正在创建的那个实例对象,即正在new谁,this就代表谁
  • this在非静态实例方法中:表示调用该方法的对象,即谁在调用,this就代表谁。
  • this不能出现在静态代码块和静态方法中

this使用格式

  • this.成员变量名
    • 当方法的局部变量与当前对象的成员变量重名时,就可以在成员变量前面加this.,如果没有重名问题,就可以省略this.
    • this.成员变量会先从本类声明的成员变量列表中查找,如果未找到,会去从父类继承的在子类中仍然可见的成员变量列表中查找
  • this.成员方法
    • 调用当前对象的成员方法时,都可以加"this.",也可以省略,实际开发中都省略
    • 当前对象的成员方法,先从本类声明的成员方法列表中查找,如果未找到,会去从父类继承的在子类中仍然可见的成员方法列表中查找
  • this()或this(实参列表)
    • 只能调用本类的其他构造器
    • 必须在构造器的首行
    • 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(【实参列表】)",否则会发生递归调用死循环

super关键字

super的含义

  • super代表当前对象中从父类的引用的

super使用的前提

  • 通过super引用父类的xx,都是在子类中仍然可见的
  • 不能在静态代码块和静态方法中使用super

super的使用格式

  • super.成员变量
    • 在子类中访问父类的成员变量,特别是当子类的成员变量与父类的成员变量重名时。
  • super.成员方法
    • 在子类中调用父类的成员方法,特别是当子类重写了父类的成员方法时
    • 尤其当子父类出现同名成员时,可以用 super 表明调用的是父类中的成员
    • super 的追溯不仅限于直接父类
    • super this 的用法相像, this 代表本类对象的引用, super 代表父类的内存空间的标识
  • super()或super(实参列表)
    • 在子类的构造器首行,用于表示调用父类的哪个实例初始化方法
    • 子类中所有的构造器默认都会访问父类中空参数的构造器
    • 当父类中没有空参数的构造器时,子类的构造器必须通过this(数列表)或者super(参数列表)语句指定调用本类或者父类中相应的 构造器。同时,只能”二选一,且必须放在构造器的首行
    • 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又 没有无参的构造器,则编译出错
注意:
  • 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
  • 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
  • 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 "this(形参列表)"
  • "this(形参列表)"必须声明在类的构造器的首行!
  • 在类的一个构造器中,最多只能声明一个"this(形参列表)"
  • super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。
  • 尤其当子父类出现同名成员时,可以用 super 表明调用的是父类中的成员
  • super 的追溯不仅限于直接父类
  • super和 this 的用法相像, this 代表本类对象的引用, super 代表父类的内存空间的标识
this和super的区别
                                                         

就近原则和追根溯源原则

找变量

  • 没有super和this
    • 在构造器、代码块、方法中如果出现使用某个变量,先查看是否是当前块声明的局部变量,
    • 如果不是局部变量,先从当前执行代码的本类去找成员变量
    • 如果从当前执行代码的本类中没有找到,会往上找父类的(非private,跨包还不能是缺省的)
  • 有this :代表当前对象
    • 通过this找成员变量时,先从当前执行代码的本类中找,没有的会往上找父类的(非private,跨包还不能是缺省的)。
  • 有super :代表父类的
    • 通过super找成员变量,直接从当前执行代码所在类的父类找
    • super()或super(实参列表)只能从直接父类找
    • 通过super只能访问父类在子类中可见的(非private,跨包还不能是缺省的)

注意:super和this都不能出现在静态方法和静态代码块中,因为super和this都是存在与对象中的

找方法

  • 没有super和this:先从当前对象(调用方法的对象)的本类找,如果没有,再从直接父类找,再没有,继续往上追溯
  • 有this:先从当前对象(调用方法的对象)的本类找,如果没有,再从父类继承的可见的方法列表中查找
  • 有super:直接从当前对象(调用方法的对象)的父类继承的可见的方法列表中查找

找构造器

  • this()或this(实参列表):只从本类中,不会再往上追溯
  • super()或super(实参列表):只从直接父类找,不会再往上追溯

分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进