java中static的知识点

1.用在类中修饰成员(属性和方法),不能修饰构造方法

用static修饰的成员是属于类本身的(存放在数据存储区),而不是属于对象,被类的所有对象所共有。可以通过类名的方式或类对象名访问static属性的成员(通过类名访问的条件:静态非私有的成员)。

class A
{
    static int i = 1;
    public static void show()
    {
        System.out.println("嘿嘿");
    }
}

class Test
{
    public static void main(String[] args)
    {
        System.out.println("i = "+A.i);
        A.show();
    }
}

2.静态方法只能访问同类中的静态成员(变量和方法),不能访问非静态成员。非静态方法可以访问类中所有的成员,包括静态成员。

原因:非静态成员需要实例对象才能访问,而静态方法在使用前不用创建实例对象

class A
{
    public int i = 1;
    static void f()
    {
        g();//错误:静态方法不能访问非静态成员
        i = 2;//错误,同样不能访问
    }
    public void g()
    {
        f();//OK,说明非静态方法可以访问静态成员
    }
}

class Test
{
    public static void main(String[] args)
    {
        A a1 = new A();
        a1.g();
    }
}

3.静态方法不能以任何方式引用this和super关键字。

因为静态方法在使用前不用创建实例对象,当静态方法被调用时,this所引用的对象还没产生。

4.static的例子

  • 编写一个程序统计该类创建了多少个对象
class A
{
    private int i;
    private static int count = 0;//对象个数,因为Count是所以对象公用的,所以用static减少内存占用
    
    public static int getCount() //获得该类产生的对象个数
    {
        return count;
    }
    
    public A()
    {
        ++count;
    }
    public A(int i)
    {
        this.i = i;
        ++count;
    }
}

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
        A a1 = new A();
        System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
        A a2 = new A(1);
        System.out.println("当前时刻创建的A对象个数为:"+A.getCount());
    }
}
当前时刻创建的A对象个数为:0
当前时刻创建的A对象个数为:1
当前时刻创建的A对象个数为:2
  • 要求一个类只能创建一个对象
    类中的成员可以是属性,方法,也可以是对象(其他类的对象或者自身的对象)
class A
{
    public int i = 1;
    private static A a1 = new A();//a是A的唯一一个对象,同时也是A的成员,static一定要有,否则后面的getA()无法访问
    
    private A()  //private保证外部无法new A的对象,只能在A的内部创建
    {
        
    }
    
    public static  A getA()//对外部提供的接口,只能是静态的;A说明该方法返回的是A的对象
    {
        return a1;
    }
}

public class Test
{
    public static void main(String[] args)
    {
        A a2 = A.getA();
        A a3 = A.getA();
        a2.i = 2;
        
        System.out.println(a3.i);
        if (a2 == a3)
        {
            System.out.println("a1和a2相等");
        }
    }
}
2   //说明a3和a2是同一个i
a1和a2相等
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,577评论 0 11
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 4,887评论 0 2
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,044评论 0 4
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,797评论 1 32
  • 看到一个相濡以沫的故事。大意是一个口味清淡的姑娘,嫁给了一个无辣不欢的汉子。在回娘家看到父亲做菜放多了盐...
    小小忍冬花阅读 4,256评论 2 18