赞
踩
实例方法
实例方法是需要在调用之前创建其类的对象的方法。要调用实例方法,我们必须创建在其中定义它的类的对象。
内存分配:
这些方法本身存储在堆的永久代空间中,但参数(传递给它们的参数)及其局部变量和要返回的值在堆栈中分配。它们可以在它们所在的同一个类中调用,也可以从定义在同一个包或其他包中的不同类中调用,这取决于提供给所需实例方法的访问类型。
要点:
下面是访问实例方法的实现:
- package org.jake.demo.utils;
-
- public class InstanceUtils {
-
- public String name = "";
-
- /**
- * 在同一个类中或者从同一个包或不同包中定义的另一个类中调用的实例方法。
- *
- * @param name
- */
- public void getName(String name) {
- this.name = name;
- }
- }
-
- package org.jake.demo;
-
- import org.jake.demo.utils.InstanceUtils;
-
- public class App {
- public static void main(String[] args) {
- InstanceUtils instanceUtils1 = new InstanceUtils();
- InstanceUtils instanceUtils2 = new InstanceUtils();
- instanceUtils1.getName("instanceUtilsName1");
- instanceUtils2.getName("instanceUtilsName2");
- System.out.println(instanceUtils1.name);
- System.out.println(instanceUtils2.name);
-
- }
- }
输出:
- instanceUtilsName1
- instanceUtilsName2
静态方法
静态方法是Java中不需要创建类对象就可以调用的方法。它们由类名本身或对该类的对象的引用来引用。
内存分配:
它们存储在堆的永久代空间中,因为它们与它们所在的类相关联,而不是与该类的对象相关联。但是它们的局部变量和传递给它们的参数都存储在堆栈中。由于它们属于类,因此可以在不创建类的对象的情况下调用它们。
要点:
下面是访问静态方法的实现:
- package org.jake.demo.utils;
-
- public class StaticUtils {
- public static String name = "";
-
- public static void getName(String name) {
- StaticUtils.name = name;
- }
- }
-
- package org.jake.demo;
-
- import org.jake.demo.utils.StaticUtils;
-
- public class App {
- public static void main(String[] args) {
-
- StaticUtils.getName("staticUtilsName");
- StaticUtils.getName("staticUtilsName");
- System.out.println(StaticUtils.name);
- System.out.println(StaticUtils.name);
- }
- }
输出:
- staticUtilsName
- staticUtilsName
注意:类中定义的静态变量及其值(原语或引用)存储在内存的永久代空间中。
在第一行中,值 1 将存储在 PermGen 部分。在第二行中,引用 obj 将存储在 PermGen 部分,而它引用的 Object 将存储在堆部分。
什么时候使用静态方法?
实例方法 vs 静态方法
this静态字段报错:
- package org.jake.demo.utils;
-
- public class StaticUtils {
- public static String name = "";
-
- public static void getName(String name) {
- this.name = name;
- }
- }
-
- package org.jake.demo.utils;
-
- public class InstanceUtils {
-
- public String name = "";
-
- /**
- * 在同一个类中或者从同一个包或不同包中定义的另一个类中调用的实例方法。
- *
- * @param name
- */
- public void getName(String name) {
- this.name = name;
- }
- }
-
- package org.jake.demo;
-
- import org.jake.demo.utils.InstanceUtils;
- import org.jake.demo.utils.StaticUtils;
-
- public class App {
- public static void main(String[] args) {
- InstanceUtils instanceUtils1 = new InstanceUtils();
- InstanceUtils instanceUtils2 = new InstanceUtils();
- instanceUtils1.getName("instanceUtilsName1");
- instanceUtils2.getName("instanceUtilsName2");
- System.out.println(instanceUtils1.name);
- System.out.println(instanceUtils2.name);
-
- StaticUtils.getName("staticUtilsName");
- StaticUtils.getName("staticUtilsName");
- System.out.println(StaticUtils.name);
- System.out.println(StaticUtils.name);
- }
- }
输出:
- instanceUtilsName1
- instanceUtilsName2
- Exception in thread "main" java.lang.Error: Unresolved compilation problem:
- Cannot use this in a static context
-
- at org.jake.demo.utils.StaticUtils.getName(StaticUtils.java:7)
- at org.jake.demo.App.main(App.java:15)
注意:在作为工具类时,实例方法和静态方法,要考虑线程安全和内存分配问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。