Java~详细区分Java中的构造方法、实例方法与类方法

构造方法

  • 构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。

要求:

  1. 方法名必须与类名相同
  2. 无返回值
  3. 不能被static final native abstract和synchronized修饰
  4. 不能被子类继承。
  5. 默认构造方法为无参
  6. 可以被重载
  7. 如果是子类构造方法,必须在第一行用super调用父类构造方法
  8. 构造方法为private级别时,意味着只能在当前类中访问它:当前类的其他构造方法中可以通过this语句调用,此外还可以在当前类的成员方法中使用new调用。
    只要如下情况才推荐将构造方法为private级别
  • 这个类中仅仅包含一些供其他程序调用的静态方法,没有任何实例方法。
  • 禁止这个类被继承。声明为private后,如果定义了它的子类,子类的方法中无法调用父类的任何构造方法。
  • 类需要把构造自身实例的细节封装起来,不允许其他程序通过new语句创建这个类的实例。提供静态方法。

实例方法

  • 没有用static修饰,也叫非静态方法
  1. 当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用
  2. 当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。
  3. 所以实例方法也可以称之为对象方法,相比类方法,对象方法几乎没什么限制
  • 对象方法中可以引用对象变量,也可以引用类变量
  • 对象方法中可以调用类方法(被static修饰的), 当然也可以调用对象方法(实例方法)
  • 对象方法中可以使用super、this关键字

类方法

  • Java中类的方法也有类方法(用static修饰,也叫静态方法
  1. 当类的字节码文件加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失
  2. 因此类方法也会有如下限制
  • 类方法中不能引用对象变量(实例变量)
    实例变量的创建与实例方法的创建相同,也是在类的对象创建时完成,所以不能引用实例变量,因为这个时候实例变量还没有分配内存地址
  • 在类方法中不能使用super和this关键字
    因为super和this都指向的是父类和本类的对象,而在类方法中调用的时候,这些指代的对象有可能都还没有创建
  • 类方法中不能调用实例方法
    与不能调用实例变量同理
  • 类方法不能被覆盖

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/106576212