成员变量与局部变量的区别
- 从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数; 成员变量可以被 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/
- 存放位置: ?类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
- 生命周期: 类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失
参考资料
文档信息
- 本文作者:Bob.Zhu
- 本文链接:https://adolphor.github.io/2021/07/03/11-java-basic-method/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)