"public" 和 "public static" 之间的区别是什么?

54

static 是什么意思?

我知道 public 表示可以从类外部访问,而 private 只能在类内部访问…


8
只有在实例化类之后,公共方法和属性才可以通过“->”符号调用并访问。公共静态方法和属性则不需要实例化类即可访问,并且可以通过“::”调用。 - arma
好问题。 - KD.S.T.
3
2011年的我真是太蠢了 :x - Alex
5个回答

46

静态意味着可以在不实例化类的情况下进行访问。这对于常量很好。

静态方法需要对对象的状态没有影响。除了参数外,它们可以有局部变量。

可修改的静态变量是有风险的。它们的行为类似于全局变量,可能会导致应用程序脆弱。跟踪变量的修改位置可能会很困难。

静态方法是没有风险的。它们可以替代重复的代码,增加代码经过充分测试和正确的可能性。


静态变量是否有风险? - KD.S.T.
1
@ichimaru 静态函数并不具有风险,但是可修改的静态变量可能会带来风险。它们可能会充当全局变量,从而使应用程序变得脆弱,并且跟踪变量被修改的位置也会变得困难。静态方法可以替换重复的代码,增加代码被充分测试和正确性的可能性。 - BillThor

43

public: 公共的声明可以被任何地方访问。

protected: 受保护的限制对继承和父类(以及定义该项的类)进行访问。

private: 私有的仅限于定义该项目的类看到。

static: 静态变量仅存在于局部函数作用域中,但当程序执行离开该作用域时,它不会失去其值。

final: final关键字通过在定义前缀一个final来防止子类覆盖方法。如果类本身被定义为final,则不能扩展。


除PHP之外:

transient: 瞬态变量是不能被序列化的变量。

volatile: 声明为volatile的变量可能会被多个线程同时修改。声明为volatile的变量不会被编译器优化,因为它们的值随时可能会改变。


什么是序列化? - user1986815
你提到关键字 'static' 时说 "这对于常量很好。" 为什么只有常量呢?根据我的经验,它适用于大多数——如果不是全部——在类中从任何地方访问的实例变量! - Apostolos

17

http://php.net/manual/zh/language.oop5.static.php

将类属性或方法声明为静态的,可以在不需要实例化该类的情况下访问它们。 声明为静态的属性不能使用实例化的类对象访问(尽管静态方法可以)。


5
一个例子:当使用 static 关键字时,我们不能使用 $this
class Foo {
    private $foo='private';

    private function priv_func() {
        echo 'priv_method';
    }

    public static function get() {
        echo $this->foo;
        $this->priv_func();
    }
}

$obj = new Foo();
$obj->get();

致命错误:在非对象上下文中使用 $this(…)

1
你也可以使用 self 来访问同一类中的静态方法和静态变量。例如:self::priv_func(); - Markus Zeller
我觉得如果这个例子能多解释一些就更好了,因为这一页上没有其他的例子。不幸的是,我真的不明白你想教我什么。 - Eoin

0

例子:

public class Methods_Test1 
{   
    public static void Display(String Name)
    {
        System.out.println("Hello There " + Name);
        System.out.println("I am from Display method");
    }


    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter name");
        String name = sc.next();
        Obj.Display(name);

    }

公共静态void Display(String name)方法可以在其自己的类中作为静态方法访问,可以在不创建该类的对象的情况下访问,而对于外部类而言,相同的方法则行为为public,可以通过创建对象来访问。


这里定义了Obj吗?我们不会出现错误吗?在Obj.Display(name);处。 - Rohan Devaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接