美文网首页
第五章:面向对象基础——static关键字。

第五章:面向对象基础——static关键字。

作者: 孤意的学习笔记 | 来源:发表于2017-10-13 20:54 被阅读0次

本章目标

  • 了解static关键字的作用
  • 掌握static属性、static方法的声明及使用
  • 掌握static使用的限制

1、具体内容

在Java中可以使用static声明属性或方法,因为在之前所讲解的属性和方法都是属于非static的,这样一来,每个对象都占有各自的内容,如果现在希望一个属性被所有对象所共同拥有,则可以将其声明为static类型,声明static类型的属性或方法也称为类方法,可以由类名称直接调用。

1.1、使用static声明属性

Static可以声明全局属性,全局属性到底有哪些作用呢?先看下以下程序代码:

class Person{   // 定义Person类
    String name ;       // 定义name属性,暂时不封装
    int age ;           // 定义age属性,暂时不封装
    String country = "A城" ; // 定义城市属性,有默认值
    public Person(String name,int age){
        this.name = name ;
        this.age = age; 
    }
    public void info(){ // 得到信息
        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
    }
};
public class StaticDemo01{
    public static void main(String args[]){
        Person p1 = new Person("张三",30) ;    // 实例化对象
        Person p2 = new Person("李四",31) ;    // 实例化对象
        Person p3 = new Person("王五",32) ;    // 实例化对象

        p1.info() ;
        p2.info() ;
        p3.info() ;
    }
};
输出结果:
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城

以上代码确实实现了一些基本的功能,但是如果此时城市的名称不叫“A城”,而改成了“B城”,如果现在已经产生了5000个对象,那么需要修改5000个对象的country属性。所以此时最好使用static关键字声明属性。
范例:使用static修改城市属性

class Person{   // 定义Person类
    String name ;       // 定义name属性,暂时不封装
    int age ;           // 定义age属性,暂时不封装
    static String country = "A城" ;  // 定义城市属性,有默认值,static
    public Person(String name,int age){
        this.name = name ;
        this.age = age; 
    }
    public void info(){ // 得到信息
        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
    }
};
public class StaticDemo02{
    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.info() ;
        p2.info() ;
        p3.info() ;
        p1.country = "B城" ;     // 修改static属性
        System.out.println("--------------- 修改之后 -------------") ;
        p1.info() ;
        p2.info() ;
        p3.info() ;
    }
};
输出结果:
--------------- 修改之前 -------------
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城
--------------- 修改之后 -------------
姓名:张三,年龄:30,城市:B城
姓名:李四,年龄:31,城市:B城
姓名:王五,年龄:32,城市:B城

修改一个对象中的country属性,则其他对象的country属性内容全部改变,证明此属性是所有对象共享的。


1.2、声明static方法

如果一个方法是用了static关键字声明,则此方法可以直接使用类名称进行调用,下面将之前代码中的全部属性进行封装。

class Person{   // 定义Person类
    private String name ;       // 定义name属性,暂时不封装
    private int age ;           // 定义age属性,暂时不封装
    private static String country = "A城" ;  // 定义城市属性,有默认值,static
    public static void setCountry(String c){ // 此方法可以直接由类名称调用
        country = c ;
    }
    public static String getCountry(){
        return country ;
    }
    public Person(String name,int age){
        this.name = name ;
        this.age = age; 
    }
    public void info(){ // 得到信息
        System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
    }
};
public class StaticDemo04{
    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.info() ;
        p2.info() ;
        p3.info() ;
        Person.setCountry("B城") ;       // 调用静态方法修改static属性的内容
        System.out.println("--------------- 修改之后 -------------") ;
        p1.info() ;
        p2.info() ;
        p3.info() ;
    }
};
输出结果:
--------------- 修改之前 -------------
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城
--------------- 修改之后 -------------
姓名:张三,年龄:30,城市:B城
姓名:李四,年龄:31,城市:B城
姓名:王五,年龄:32,城市:B城

注意点:使用static方法,不能调用非static的属性或方法

class Person{   // 定义Person类
    private static String country = "A城" ;   // 定义静态属性
    private String name = "Hello" ;
    public static void sFun(String c){
        System.out.println("name = " + name) ;  // 错误,不能调用非static属性
        fun() ;                                 // 错误,不能调用非static方法
    }
    public void fun(){
        System.out.println("World") ;
    }
};

实际上这一点非常好理解,因为static属性或方法可以在对象没有实例化的时候就直接进行调用了。

1.3、static的其他应用

因为每一个实例化对象在操作的时候都必须调用构造方法完成,所以如果现在要进行统计的话,则直接在构造方法之中增加一个static的属性即可。

class Demo{ // 定义Person类
    private static int count = 0 ;  // 所有对象共享此属性
    public Demo(){
        count++ ;                    // 只要有对象产生就应该自增
        System.out.println("产生了" + count + "个对象!") ;
    } 
};
public class StaticDemo06{
    public static void main(String args[]){
        new Demo() ;            // 增加新对象
        new Demo() ;            // 增加新对象
        new Demo() ;            // 增加新对象
    }
};
输出结果:
产生了1个对象!
产生了2个对象!
产生了3个对象!

范例:自动编名操作

class Demo{ // 定义Person类
    private String name ;           // 保存名字
    private static int count = 0 ;  // 所有对象共享此属性
    public Demo(){
        count++ ;                   // 有对象产生就自增
        this.name = "DEMO-" + count ;   // 自动进行编名操作
    } 
    public Demo(String name){
        this.name = name;           // 可以通过构造赋值
    }
    public String getName(){        // 取得姓名
        return this.name ;
    }
};
public class StaticDemo07{
    public static void main(String args[]){
        System.out.println(new Demo().getName()) ;
        System.out.println(new Demo("LXH").getName()) ;
        System.out.println(new Demo().getName()) ;
        System.out.println(new Demo("MLDN").getName()) ;
        System.out.println(new Demo().getName()) ;
    }
};
输出结果:
DEMO-1
LXH
DEMO-2
MLDN
DEMO-3

这一点,在之后的Java应用中也会有相关的实现。

2、总结

1、使用static声明属性与非static声明属性的区别
2、使用static声明的属性或方法可以直接由类名称调用
3、使用static方法的时候一定要注意,只能访问static声明的属性或方法,而非static生命的属性和方法是不能访问,因为可以在对象没有实例化时就直接调用,而其他的属性或方法在对象实例化之后才可以使用。
4、了解static的两个范例。

相关文章

网友评论

      本文标题:第五章:面向对象基础——static关键字。

      本文链接:https://www.haomeiwen.com/subject/iyltuxtx.html