Java什么是静态方法法为什么不能访问非什么是静态方法法

java的接口为什么不能有静态方法

最近看到网上很多程序员对java接口不支持静态方法感到疑惑,到国外网站看了一下,以下是自己的一些看法。

接口是对象层次的东西,即实现接口的类必须重写接口的方法,而要用这个方法你就必须new一个对象出来。而静态方法是属于类层次方面的,即调用静态方法是不需要也不推荐通过对象来调用的,而且静态方法是不存在重写或覆盖这种说法的,子类对父类同名同参数的方法只有隐藏这一说法,即在子类内部直接调用方法是调用子类的,调用父类的只能加上super或父类名。在外部比如main里,假设B类继承了A类,A和B都有一个同名同参数的方法sayHello(),A a = new B(),然后a.sayHello(), 这里被调用的方法将是A即父类的。为什么呢,因为静态方法和对象无关,是编译时就确定的,所以编译器只能直接找他知道的,这里a能确定的信息就是他的表面类型A(表面类型是对象声明时的类型,而实际类型即B,是对象背后最完整的类型)。你可能会说,这里B对于编译器也能确定,但如果是A a = getSubClass()呢?所以静态的东西直接用类层次来调用能够避免歧义。回到接口的讨论,个人认为这样设计是设计思想的考虑,因为接口的方法就是要实现接口的类去覆盖重写,而静态方法是没法重写的,加进去会带来一系列问题。但是接口是可以写成员变量的(事实上成员变量在子类和父类之间只有隐藏的关系),而且这里有个前提条件,就是这些成员只能是public+static+final的,因为接口是要给很多类实现的,而且一个类也能实现多个接口。总的来说,接口的方法和成员变量就是对着干,方法不能是static的,实现类必须重写,而成员变量只能是static的,而且不能修改,挺有趣的吧。

  说到这里,还要涉及到抽象类。抽象类其实就是处在接口和普通类的中间,可以有静态方法,但不能是abstract的,即普通类的东西按普通类的规则,接口的东西按接口的规则(抽象方法就是接口的东西)。

注:jdk8已经支持接口加入静态方法,但据说是为了lambda(函数式编程),平时的话尽量避免这样做。

加载中,请稍候......

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

}

在上一篇文章中,小编为您详细介绍了关于《》相关知识。本篇中小编将再为您讲解标题Java 项目静态方法过多会有什么样影响?静态类、静态方法影不影响多线程性能。 之前本站也有不少关于类似内容介绍:1.2.3.

最近在看 Play! framework,整个控制层都是静态方法,引发了很多争论和口水,大家怎么看的?

静态方法不能继承,会影响①部分设计思路,设计出的程序比较结构化。

①. 可能难以mock,不方便单元测试;

②. 可能难以与Spring这样的IoC容器,或基于这些IoC容器的框架、组件相结合;

不会因为多线程调用同①块代码而变慢(除非为了控制同步,进行了加锁),相反会因为频繁调用①个方法而触发jit,加快运行速度。另外,如果对jvm有所了解,调用类方法和调用实例方法完全是①样的,唯①的区别是,调用实例方法时会首先把this引用压入局部变量表的第①个slot,因此这两种调用不会有性能上的差别

去掉static就是少了①个this参数,可能少①层virtual table的dispatch,其他的没区别,都是①函数(或者类)。

具体哪儿有多出来的对象创建呢?

和多线程基本没关系……

静态和单例是两个相关但不等价的概念

同时访问的主要开销来自于线程切换,创建单个对象并没有那么大的影响(除非你调用其它资源)

总之这个问题要具体分析。没有①般性的正确答案。

编后语:关于《Java 项目静态方法过多会有什么样影响?静态类、静态方法影不影响多线程性能》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《》,感兴趣的同学可以点击进去看看。

}

只要记住构造方法的方法名一定是跟类名相同的,而且没有任何返回值类型或者static等关键字修饰的方法就是构造方法。

只要任何一个方法中带有static修饰的,也就是有static关键字在方法名前面的方法就是静态方法,没有static关键字修饰的就是普通方法。

静态方法可以随意在任何的静态方法或普通方法中可以直接调用,但是要想普通方法在静态方法中使用时需要通过生成对象,再通过对象去调用。

换句话说,有static关键字修饰的变量或方法都是它本类中所有方法共享的资源

}

我要回帖

更多关于 什么是静态方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信