Java基础 - 方法

2021/07/03 Java 共 1608 字,约 5 分钟
Bob.Zhu

成员变量与局部变量的区别

  • 从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数; 成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
  • 从变量在内存中的存储方式来看,如果成员变量是使用 static 修饰的,那么这个成员变量是属于类 的,如果没有使用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在 于栈内存。
  • 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随 着方法的调用而自动消失。
  • 从变量是否有默认值来看,成员变量如果没有被赋初,则会自动以类型的默认值而赋值(一种情况例外: 被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

重载和重写的区别

  • 重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
  • 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时, 你就要覆盖父类方法

方法的签名

Java允许重载构造方法也允许重载普通方法,要完整描述一个方法,需要指出方法名以及参数类型,这叫做 方法的签名(signature)。例如,String 有4个称为indexof的方法,他们的签名是:

indexof(int)
indexof(int, int)
indexof(String)
indexof(String, int)

返回类型不是签名的一部分,也就是说不能有两个名字相同、参数类型相同却反悔不同类型值的方法。

重写

重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。

  • 返回值类型、方法名、参数列表必须相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
  • 如果父类方法访问修饰符为 private/final/static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
  • 构造方法无法被重写

静态方法和实例方法有何不同

  • 在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式(不推荐)。 而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例 成员变量和实例方法;实例方法则无此限制。

在一个静态方法内调用一个非静态成员为什么是非法的

这个需要结合 JVM 的相关知识,静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接 访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,然后通过类的实例对象去访问。在类的 非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存, 而非静态方法是属于对象的,对象是在类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个 对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它 是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配 内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能 调用一个不存在的方法。

实例变量和类变量的区别

TODO:http://xzoo.org/posts/java-classinstancevariable/

  • 存放位置: ?类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
  • 生命周期: 类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失

参考资料

文档信息

Search

    Table of Contents