方法的多态static理解
要强调的是,,多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.

这里讨论的是static方法不能发生多态.值得注意的是, 所谓的static方法不能多态指的是:override的方法本身是不是static的,而不是指调用override方法的方法是不是static 的!比如以下程序:
class Father {
public void act() {
System.out.println("Father.act()");
}
}

class Son extends Father {
public void act() {
System.out.println("Son.act()");
}
}
public    class    Test {
public static    void test(Father i) {    //static方法
i.act();
}
public static void main(String[] a)    {
Son son = new Son();
test(son);

}
}    //输出结果为:Son.act(),如果static不能多态,那结果不就应该是Father.act()吗?

其实,就象上面说的.我们要考虑的是 的act()方法是不是static,有没有多态,而不是调用的方法(test())是不是static的
这跟test方法是否static无关,若把两个act方法都修改成static,则输出结果就是 Father.act(),因为static 方法不能多态

static方法(与隐式static方法)

static方法就是没有this的方法.在static方法的内部不能调用非静态方法,反过来,非静态方法倒是可以调用static方法.
      !!! 值得注意的是:这里说的是在static方法内部,不能直接调用非static方法,但可以通过生成对象来调用非静态方法.
        在static方法内部,也不可以调用非static变量,其实道理很简单,因为static是面向全局的,相当于全局方法,不可能只针对某个类中的一般变量而使用.

在static与非static方法内部都不能声明static变量.(全局变量),因为,在方法内声明的变量都是局部变量,不可能在里面定义一个全局变量.

=====了解上面的知识后,你可能会发现有一个特例:在编程思想第四版P157上,(还有很多地方都曾经说过)构造器隐式的就是static的!然而在构造器内部为什么可以直接调用非静态方法??
            static方法就是没有this的方法.在static方法的内部不能调用非静态方法,反过来,非静态方法倒是可以调用static方法.
     !!! 值得注意的是:这里说的是在static方法内部,不能直接调用非static方法,但可以通过生成对象来调用非静态方法.
       在static方法内部,也不可以调用非static变量,其实道理很简单,因为static是面向全局的,相当于全局方法,不可能只针对某个类中的一般变量而使用.

在static与非static方法内部都不能声明static变量.(全局变量),因为,在方法内声明的变量都是局部变量,不可能在里面定义一个全局变量.

=====了解上面的知识后,你可能会发现有一个特例:在编程思想第四版P157上,(还有很多地方都曾经说过)构造器隐式的就是static的!然而在构造器内部为什么可以直接调用非静态方法??
      所谓显式隐式static,是指类在实例化时,系统会执行的代码
比如
public class StaticTest {
     
      { //这样没有static关键字的,叫隐式static,系统执行完显式static后会接着执行隐式static的代码
          System.out.println("hide static");
          show(); // 这个方法不是static的,但是在这里不会出错
      }
     
      static { //这样有static关键字的叫显式static,系统会先执行显式static的代码
          System.out.println("static");
          //show(); //这个方法不是static的,所以会出错
          }
     
      public StaticTest() { //执行完显式和隐式static后,系统会执行构造器的代码,因为构造器没有static,但也会被执行,跟隐式static一样,所以书上就把它说成隐式static了
          System.out.println("constuctor");
      }
     
      public void show() {
          System.out.println("show");
      }
     
      public static void main(String[] args) {
          new StaticTest();
      }
     
}

所以所谓显式隐式static,只是对于类实例化执行代码的先后顺序而言的,从某种意义上说,不带static的都可以叫隐式static,隐式static可以调用隐式static

转载于:https://www.cnblogs.com/lianglee/archive/2010/06/14/1758164.html

关于static方法相关推荐

  1. JAVA Static方法与单例模式的理解

    最近用sonar测评代码质量的时候,发现一个问题,工程中一些util类,以前写的static方法都提示最好用单例的方式进行改正. 为此,我仔细想了想,发现还是很有道理的.这里谈谈我个人对static方 ...

  2. 是否可以从一个static方法内部发出对非static方法的调用?

    *问题:是否可以从一个static方法内部发出对非static方法的调用?  *   * 答:不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,  *         才可以在 ...

  3. java静态方法和非静态方法内存区别_static方法和非static方法的区别(java)

    ● 生命周期(Lifecycle): 静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关 ...

  4. java中static方法的继承性

    首先需要知道的是,java中所有的public实例方法都默认是virtual的,static方法不是virtual的,所以static方法可以被覆盖(new),但不可被重写(override) 1.被 ...

  5. java中的static方法可以被重写吗?(从方法调用过程理解)

    答案是:不可以. 首先明确一点,在子类中重写父类的static方法,是不会报错的,编译也可以通过,但是在通过一个声明为父类,实际类型为子类的引用变量调用该方法时,发现被调用的仍是父类中原本以为会被覆盖 ...

  6. static方法与非static方法是否可以互相调用

    情况一.static方法调用非static方法 非静态方法只有实例对象才可调用,而静态方法随着类的加载而加载,类的加载在实例对象产生之前,所以静态方法不能调用非静态方法 情况二.非atic方法调用st ...

  7. java 静态方法中为什么不可以使用关键字this _super_Java static方法里为什么不能使用this关键字,和Super...

    Static方法是类方法,先于任何的实例(对象)存在. 即Static方法在类加载时就已经存在了(JAVA虚拟机初始化时),但是对象是在创建时才在内存中生成. 而this指代的是当前的对象. stat ...

  8. java main方法调用非静态方法_java中main函数怎么调用外部非static方法

    展开全部 方法可以分为静态方法和实例方法 在main函数里调用非static方法(实例方法),那么32313133353236313431303231363533e78988e69d833133336 ...

  9. 使用powermock 测试static 方法,jacoco统计覆盖率问题

    使用powermock 对private 和static 方法进行mock 测试, public class LogUtil {public static BaseAuditLog getLogBea ...

  10. php static方法的作用是什么,php static方法指的是什么

    php static方法指的是用php中static关键字来定义静态方法和属性,static也可用于定义静态变量以及后期静态绑定,其使用语法如"public static $my_stati ...

最新文章

  1. 初试CSS(二):选择器
  2. 国产研发管理工具也在慢慢壮大,Worktile7岁了!
  3. Docker核心技术
  4. (教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...
  5. 面向手绘图形,涵盖多个主题,CVPR 2022 SketchDL Workshop开始征稿!
  6. python 生成exe anaconda_Anaconda 搭建 Tensorflow 2 开发环境
  7. 彻底搞定C指针---指向指针的指针(转)
  8. iOS 又出重大Bug!一秒搞崩 iPhone 的网络连接功能
  9. python图片内容识别_ubuntu 安装 pytesseract 模块进行图片内容识别
  10. 9.RabbitMQ实战 --- 使用REST API控制Rabbit
  11. hdu 5437Alisha’s Party(优先队列)
  12. python安装scipy数次失败,之后安装Anaconda后使用sublime切换python解释器后解决pip无法安装scipy问题
  13. 【PLSQL】过程procedure形参和参数
  14. 控制反转和依赖注入的理解(通俗易懂)
  15. 优雅地从浏览器打开本地应用
  16. 电脑上onedrive打不开解决
  17. 微机接口实验一 :8255并行接口实验
  18. ## 03. Stream流
  19. 97岁的诺奖得主,活着就会有好事发生
  20. python读取游戏数据_用Python抓取并分析了1982场英雄联盟数据,教你开局前预测游戏对局胜负!...

热门文章

  1. python相比于excel的优势_对照Excel使用Python进行数据分析,更快掌握
  2. java伪代码生成器_JAVA单例模式的实现伪代码
  3. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar
  4. Elasticsearch 内置分析器Analyzer
  5. [收藏]7个可以调研B端产品的网站
  6. 产品经理如何避免被程序员打?
  7. 能干的产品经理比不上能说的产品经理
  8. 二叉树知识点最详细最全讲解
  9. linux3.10内核支持mpls,将MPLS编译进linux内核中
  10. 如何让不懂信息化的甲方客户看懂需求文档,并确认签字?