无法从静态上下文中引用非静态方法

这篇具有很好参考价值的文章主要介绍了无法从静态上下文中引用非静态方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原因:

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

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

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

实例:

一、

  1 public class Solution {
  2     public static void main(String[] arvgs){
  3         System.out.println("请输入股票价格");
  4         int[] profit = {1, 2, 3, 4, 5, 6};
  5       
  6         maxProfit(profit, 5); // 报错
  7         
  8     }
  9     public int maxProfit(int prices[], int day){
 10         int maxprofit = 0;
 11         for (int i = 0; i < day - 1; i++){
 12             for (int j = i + 1; j < day; j++) {
 13                 int profit = prices[j] - prices[i];
 14                 if (profit > maxprofit)  
 15                     maxprofit = profit;
 16             }       
 17         }   
 18         return maxprofit;
 19     }   
 20 }   
~                                      

由于main方法其实是一个静态方法,而maxProfit方法并没有实例化,

所以会报错 错误: 无法从静态上下文中引用非静态 变量 this

  1 public class Solution {
  2     public static void main(String[] arvgs){
  3         System.out.println("请输入股票价格");
  4         int[] profit = {1, 2, 3, 4, 5, 6};
  5         Solution solution = new Solution();
  6         solution.maxProfit(profit, 5);
  7         
  8     }
  9     public int maxProfit(int prices[], int day){
 10         int maxprofit = 0;
 11         for (int i = 0; i < day - 1; i++){j
 12             for (int j = i + 1; j < day; j++) {
 13                 int profit = prices[j] - prices[i];
 14                 if (profit > maxprofit)  
 15                     maxprofit = profit;
 16             }       
 17         }   
 18         return maxprofit;
 19     }   
 20 }   
~                                      

二、

无法从静态上下文中引用非静态方法


第一种:将需要调用的方法/变量设置成static,就可以直接调用了

第二种:先创建一个实例对象,通过实例对象调用non-static方法就可以变成直接调用的变量/方法

无法从静态上下文中引用非静态方法文章来源地址https://www.toymoban.com/news/detail-419649.html

三、成员内部类中不能有静态方法和属性,内部类中有static成员时内部类也必须声明为static。

package com.bjsxt.thread.thread_extends;
//线程一:
//乌龟 100    兔子100

public class MyThreadNew {

    public static void main(String[] args) {

        //兔子
        ThreadTest threadTest = new ThreadTest();
        threadTest.setName("兔子");
        threadTest.start();

        //乌龟
        ThreadTest threadTest1 = new ThreadTest();
        threadTest1.setName("乌龟");
        threadTest1.start();
    }


    class ThreadTest extends Thread {

        @Override
        public void run() {

            // Thread.currentThread().getName():获取当前线程的名字
            for (int i = 1; i <= 100; i++) {
                System.out.println(Thread.currentThread().getName() + "跑了" + i + "米");
            }
        }
    }
}

改正方法,把ThreadTest类放成一个单独的类

package com.bjsxt.thread.thread_extends;
//线程一:
//乌龟 100    兔子100

public class MyThreadNew {

    public static void main(String[] args) {

        //兔子
        ThreadTest threadTest = new ThreadTest();
        threadTest.setName("兔子");
        threadTest.start();

        //乌龟
        ThreadTest threadTest1 = new ThreadTest();
        threadTest1.setName("乌龟");
        threadTest1.start();
    }

}
    class ThreadTest extends Thread {

        @Override
        public void run() {

            // Thread.currentThread().getName():获取当前线程的名字
            for (int i = 1; i <= 100; i++) {
                System.out.println(Thread.currentThread().getName() + "跑了" + i + "米");
            }
        }
    }

到了这里,关于无法从静态上下文中引用非静态方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在路径为[/meeting]的上下文中,Servlet[springMVC]的Servlet.service()引发了具有根本原因的异常[Request processing failed; nest

    先给大家看看我的报错 简直哭死,没好好学javaweb的后果就是变成我这样的菜鸡 接下来废话不多说,先上解决方案: 1、右键项目,找到图示位置: 2、点他 3、点 4、找到lib文件夹,一般jar都在里面 (因为我已经导入了,所以这里jar就看不到了,所以lib也看不到) 但是,如果

    2024年02月05日
    浏览(78)
  • 【python】flask执行上下文context,请求上下文和应用上下文原理解析

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月26日
    浏览(61)
  • 无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利分校受操作系统的内存管理机制启发,提出了MemGPT。

    2024年02月06日
    浏览(60)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(64)
  • 〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则

    说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费 , 如需要项目实战或者是体系化资源,文末名片加V! 作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。 荣誉: 2022年度博客之星Top4、2023年度超级个体得主、谷

    2024年02月05日
    浏览(58)
  • js执行上下文

    创造执行上下文,是为了把变量声明给保存下来,在执行时,好找到变量用 看代码要分执行前(构建执行上下文)和执行时去看 执行上下文的组成 1、词法环境:[全局对象]、scope、outer 2、This Binding:提供this的访问 构建执行上下文 1、处理声明 2、检查重复定义 3、初步赋值

    2024年02月02日
    浏览(55)
  • 执行上下文

    通过var定义(声明)的变量--在定义语句之前就可以访问到 值为undefined 通过function声明的函数--在之前就可以直接调用 值为函数定义(对象) 全局代码 函数(局部)代码 在执行全局代码前将window确定为全局执行上下文 对全局数据进行预处理 var定义的全局变量--undefined--添加

    2023年04月20日
    浏览(53)
  • Servlet 上下文参数

    2024年02月05日
    浏览(54)
  • CPU上下文切换

    CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。 CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换、

    2024年02月14日
    浏览(35)
  • 上下文切换性能篇

    现代操作系统都是多任务的分时操作系统,也就是说同时响应多个用户交互或同时支持多个任务处理,因为 CPU 的速度很快而用户交互的频率相比会低得多。所以例如在 Linux 中,可以支持远大于 CPU 数量的任务同时执行,对于单个 CPU 来说,其实任务并不是在同时执行,而是操

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包