`
yhalg1314
  • 浏览: 14054 次
  • 性别: Icon_minigender_2
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java学习笔记---12.面向对象编程07-Java中的static关键字用法

    博客分类:
  • java
阅读更多

static关键字应用点有3个: static变量(属性)的声明及引用、static方法的声明及引用以及static代码块的使用. 貌似静态代码块的使用机会比较少,这块跨过~ 主要笔记下前面两个部分.


--------------------------------------------------------------------------------

1. static 属性(变量)的声明及引用

      static属性是指把公共属性(也就是说,所有对象都一样的那个属性)单独列出来,用static加以静态化的属性. 这里需要先解释下, 为什么需要静态属性.

      先看下面的例子代码: view plaincopy to clipboardprint?
class Person  
{  
    // 为了方便,属性暂时不封装  
    String name ;  
    int age ;  
    // 所在的城市默认是为南京  
    String city = "南京" ;  
    public Person(String name,int age)  
    {  
        this.name = name ;  
        this.age = age ;  
    }  
    public String getInfo()  
    {  
        return "姓名:"+name+",年龄:"+age+",城市:"+city ;  
    }  
}  
public class Demo01  
{  
    public static void main(String args[])  
    {  
        Person p1 = new Person("张三",30) ;  
        Person p2 = new Person("李四",31) ;  
        Person p3 = new Person("王五",32) ;  
        System.out.println(p1.getInfo()) ;  
        System.out.println(p2.getInfo()) ;  
        System.out.println(p3.getInfo()) ;  
    }  
}
class Person
{
// 为了方便,属性暂时不封装
String name ;
int age ;
// 所在的城市默认是为南京
String city = "南京" ;
public Person(String name,int age)
{
   this.name = name ;
   this.age = age ;
}
public String getInfo()
{
   return "姓名:"+name+",年龄:"+age+",城市:"+city ;
}
}
public class Demo01
{
public static void main(String args[])
{
   Person p1 = new Person("张三",30) ;
   Person p2 = new Person("李四",31) ;
   Person p3 = new Person("王五",32) ;
   System.out.println(p1.getInfo()) ;
   System.out.println(p2.getInfo()) ;
   System.out.println(p3.getInfo()) ;
}
}

      这里分析下上面例子在内存中的占用情况, 如下图:



      从上图中可以看出,三个对象中都有一个一模一样的属性city="南京",这样的设计就会存在问题:
(1). 属性的内容重复存在,所有对象都有此属性;
(2). 如果现在假设南京变为北京了,假设已经产生了100000个对象,则此时如果要修改其所在城市属性的内容,则肯定要修改100000遍.

      解决方法:
      所有的对象都共同指向同一个city属性是最好的,有一个对象将city属性修改了,则其他的也会受影响。此时就需要使用static标识city属性了。实例图如下:



      使用static关键字声明类属性的例子如下,在该例子中,通过类名称.static属性的格式去访问并修改static属性.这在下面会接着说到.       view plaincopy to clipboardprint?
class Person  
{  
    //方便起见,暂时不封装  
    String name;  
    int age;  
    static String bornCity = "宁波";  
      
    public Person(String name,int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
    public String getInfo()  
    {  
        return "姓名: "+name+",年龄: "+age+",籍贯: "+bornCity;  
    }  
}  
class OODemo06  
{  
    public static void main(String args[])  
    {  
        Person p1 = new Person("邵逸夫",60);  
        Person p2 = new Person("包玉刚",61);  
        Person p3 = new Person("蒋介石",63);  
        System.out.println("---------------------修改籍贯之前-------------------------");  
        System.out.println("\t|-"+p1.getInfo());  
        System.out.println("\t|-"+p2.getInfo());  
        System.out.println("\t|-"+p3.getInfo());  
        System.out.println("---------------------修改籍贯之前-------------------------");  
        //通过类名称.static属性的格式去修改属性  
        Person.bornCity = "北京";  
        System.out.println("\t|-"+p1.getInfo());  
        System.out.println("\t|-"+p2.getInfo());  
        System.out.println("\t|-"+p3.getInfo());  
    }  
}
class Person
{
//方便起见,暂时不封装
String name;
int age;
static String bornCity = "宁波";

public Person(String name,int age)
{
   this.name = name;
   this.age = age;
}
public String getInfo()
{
   return "姓名: "+name+",年龄: "+age+",籍贯: "+bornCity;
}
}
class OODemo06
{
public static void main(String args[])
{
   Person p1 = new Person("邵逸夫",60);
   Person p2 = new Person("包玉刚",61);
   Person p3 = new Person("蒋介石",63);
   System.out.println("---------------------修改籍贯之前-------------------------");
   System.out.println("\t|-"+p1.getInfo());
   System.out.println("\t|-"+p2.getInfo());
   System.out.println("\t|-"+p3.getInfo());
   System.out.println("---------------------修改籍贯之前-------------------------");
   //通过类名称.static属性的格式去修改属性
   Person.bornCity = "北京";
   System.out.println("\t|-"+p1.getInfo());
   System.out.println("\t|-"+p2.getInfo());
   System.out.println("\t|-"+p3.getInfo());
}
}

      在上面例子中,访问static属性,采取了如下方式: 类名称.static属性名称, 这就是说,我们可以直接由类名称对static属性进行访问,因此使用了static的属性又被称为类属性(或者说类变量).


--------------------------------------------------------------------------------

2. static方法的声明及引用

      与static属性一样, static修饰方法,也可以直接由类名称直接访问. 例子可以参照下面程序,注意注释部分:      view plaincopy to clipboardprint?
class Person  
{  
    String name;  
    int age;  
    static String bornCity = "宁波";  
      
    //只编写一个可以修改bornCity属性的方法  
    public static void setBornCity(String city)  
    {   //this是当前对象,而static属性是隶属全类的,不是某个对象,所以不能用this关键字  
        //this.bornCity = city;  
        bornCity = city;  
    }  
      
    public Person(String name,int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
    public String getInfo()  
    {  
        return "姓名: "+name+",年龄: "+age+",籍贯: "+bornCity;  
    }  
}  
class OODemo07  
{  
    public static void main(String args[])  
    {  
        Person p1 = new Person("邵逸夫",60);  
        Person p2 = new Person("包玉刚",61);  
        Person p3 = new Person("蒋介石",63);  
        System.out.println("---------------------修改籍贯之前-------------------------");  
        System.out.println("\t|-"+p1.getInfo());  
        System.out.println("\t|-"+p2.getInfo());  
        System.out.println("\t|-"+p3.getInfo());  
        System.out.println("---------------------修改籍贯之前-------------------------");  
        //通过类名称.static属性的格式去修改属性  
        //Person.bornCity = "北京";  
        //使用static声明的方法,可以直接用类名称.方法()的格式调用  
        Person.setBornCity("北京");  
        System.out.println("\t|-"+p1.getInfo());  
        System.out.println("\t|-"+p2.getInfo());  
        System.out.println("\t|-"+p3.getInfo());  
    }  
}
class Person
{
String name;
int age;
static String bornCity = "宁波";

//只编写一个可以修改bornCity属性的方法
public static void setBornCity(String city)
{ //this是当前对象,而static属性是隶属全类的,不是某个对象,所以不能用this关键字
   //this.bornCity = city;
   bornCity = city;
}

public Person(String name,int age)
{
   this.name = name;
   this.age = age;
}
public String getInfo()
{
   return "姓名: "+name+",年龄: "+age+",籍贯: "+bornCity;
}
}
class OODemo07
{
public static void main(String args[])
{
   Person p1 = new Person("邵逸夫",60);
   Person p2 = new Person("包玉刚",61);
   Person p3 = new Person("蒋介石",63);
   System.out.println("---------------------修改籍贯之前-------------------------");
   System.out.println("\t|-"+p1.getInfo());
   System.out.println("\t|-"+p2.getInfo());
   System.out.println("\t|-"+p3.getInfo());
   System.out.println("---------------------修改籍贯之前-------------------------");
   //通过类名称.static属性的格式去修改属性
   //Person.bornCity = "北京";
   //使用static声明的方法,可以直接用类名称.方法()的格式调用
   Person.setBornCity("北京");
   System.out.println("\t|-"+p1.getInfo());
   System.out.println("\t|-"+p2.getInfo());
   System.out.println("\t|-"+p3.getInfo());
}
}

      这个程序需要注意的是,在static方法中,是不能够使用this关键字的. 因为static属性是隶属于全类而不是某个正在使用的实例化对象, 而this代表的是当前对象. 

      接下来,分别分析下static方法与static属性的访问关系,以及static方法之间的调用关系

2.1 static方法与static属性之间的关系    

      这里需要总结一下static方法/非static方法 可否访问 static属性/非static属性的关系:



       由此可见,static属性可以被static方法和非static方法访问; 但是非static属性只能被非static方法访问,不能被static方法访问!

2.2 static方法与static方法之间的关系

       这里只需要记住一句话: static方法只能直接调用static方法,否则只能通过实例化对象(new对象)来访问该方法. 这里最典型的例子是main方法的调用. 我们知道,main方法是static方法, 在main方法中要调用非static方法的话,必须要先实例化一个该方法所在类的对象,通过该实例化对象去调用方法. 如果该方法是static方法,main函数即可直接调用,不需再实例化类对象了~

       例如下面的代码, main方法只能通过实例化对象来调用方法fun(). 若fun()是定义为static的话, 就无需再new Demo()来实例化对象了...       view plaincopy to clipboardprint?
public class Demo09{  
    // static类型的方法只能调用static类型的方法  
    public static void main(String args[]){  
        new Demo09().fun() ;  
    }  
    public void fun(){  
        System.out.println("HELLO WORLD!!!") ;  
    }  
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics