无法从 static 上下文引用非 static 方法

作为JAVA初学者总会碰到许多问题,今天这个问题比较基础,但是对于只看了一些书的我来说还是比较困难,通过搜索大致了解到:

1.用static修饰的方法称为静态方法,修饰变量则为静态变量,又分别叫做类方法或者类变量。 
静态方法中不能直接调用非静态方法。因为非静态方法不是独立存在的,它是依附于对象存在——即只有申明了对象,才能通过对象调用。而静态方法则可以直接通过类名调用,而不需要申明对象。因此直接引用非静态方法就会出错。

2.比如常见的main方法都是静态的,必须由static修饰,因此在main方法里调用类的其他非静态方法,都是需要先申明对象,才能用。否则就会出现引用非静态方法的错误。

3.静态方法可以不用创建对象就调用,非静态方法必须有了对象的实例才能调用.因此想在静态方法中引用非静态方法是不可能的,因为它究竟引用的是哪个对象的非静态方法呢?编译器不可能给出答案,因为没有对象啊,所以要报错.

以下给出两段代码,一段是修改前面定义的方法,一段是声明对象。

修改定义方法:

package JAVA4;

import java.util.Random;

public class E02 {
    static Random r = new Random(47);
    public static void compareRand(){//定义为静态方法,就可以在main方法中引用
        int a = r.nextInt();
        int b = r.nextInt();
        System.out.println("a = " + a + " b = " + b);
        if(a<b)
            System.out.println("a < b");
        else if(a>b)
            System.out.println("a > b");
        else System.out.println("a = b");
    }

    public static void main(String[] args) {
        for(int i =0;i<=25;i++)
            compareRand();
    }
}

进行对象声明: 

package JAVA4;

import java.util.Random;

public class E02 {
    static Random r = new Random(47);
    void compareRand(){
        int a = r.nextInt();
        int b = r.nextInt();
        System.out.println("a = " + a + " b = " + b);
        if(a<b)
            System.out.println("a < b");
        else if(a>b)
            System.out.println("a > b");
        else System.out.println("a = b");
    }

    public static void main(String[] args) {
        E02 test = new E02();//声明对象
        for(int i =0;i<=25;i++)
            test.compareRand();//通过test.来调用
    }
}

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模板模式与上下文模式可以结合使用,以便更好地实现某些特定场景下的业务逻辑。下面是一个简单的示例,演示了如何使用模板模式和上下文模式。 ```java abstract class Game { abstract void initialize(); abstract void startPlay(); abstract void endPlay(); // 模板方法 public final void play(){ // 初始化游戏 initialize(); // 开始游戏 startPlay(); // 结束游戏 endPlay(); } } class Cricket extends Game { @Override void endPlay() { System.out.println("Cricket Game Finished!"); } @Override void initialize() { System.out.println("Cricket Game Initialized! Start playing."); } @Override void startPlay() { System.out.println("Cricket Game Started. Enjoy the game!"); } } class Football extends Game { @Override void endPlay() { System.out.println("Football Game Finished!"); } @Override void initialize() { System.out.println("Football Game Initialized! Start playing."); } @Override void startPlay() { System.out.println("Football Game Started. Enjoy the game!"); } } class GameContext { private Game game; public GameContext(Game game) { this.game = game; } public void play() { game.play(); } } public class TemplateContextPatternDemo { public static void main(String[] args) { GameContext gameContext = new GameContext(new Cricket()); gameContext.play(); System.out.println(); gameContext = new GameContext(new Football()); gameContext.play(); } } ``` 在这个示例中,我们创建了一个 `GameContext` 类来封装 `Game` 对象,并提供一个 `play()` 方法来调用 `Game` 对象的 `play()` 方法。这个类使用上下文模式,将具体的 `Game` 对象的实例化与模板方法的调用分离开来。这样,我们可以在不改变模板方法的情况下,动态地更换 `Game` 对象。 上面的代码同样演示了如何使用模板模式来实现一个游戏框架,其中 `Game` 类定义了一个模板方法 `play()`,并由具体的子类实现各自的业务逻辑。这个游戏框架可以通过上下文对象来动态地更换具体的游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值