了解超然物外的static-方法篇 | 带你学《Java面向对象编程》之十一-阿里云开发者社区

开发者社区> Java开发者> 正文

了解超然物外的static-方法篇 | 带你学《Java面向对象编程》之十一

简介: 本节简明赅要地指出了静态方法的一些使用场景与限制,并结合实际案例展示了一项static的用途。

上一篇:了解超然物外的static-属性篇 | 带你学《Java面向对象编程》之十
【本节目标】
通过学习本节,你将了解到普通方法与static方法的区别,进一步理解使用static修饰方法或属性的时机,学会使用static灵活处理一些实际场景。

static定义方法

static关键字也可以进行方法的定义,static方法的主要特点在于,其可以直接由类名称在没有是实例化对象的情况下进行调用。
范例:定义static方法

class person {             //创建所有同一个国家的类
   private String name ;
   private int age ;
   private static String country = “中华民国” ;      
   public Person(String name ,int age ){
       this.name = name ;
       this.age = age ;
   }
   public static void setCountry(String c) {     //static方法
       country = c ;
//setter、getter略
   public String getInfo() {
       return  “姓名:” + this.name + “、年龄:” +this.age + “、国家:” +this.country + ;
   }
}
public class JavaDemo {          
    public static void main(String args[]) {
        Person.setCountry(“中华人民共和国”)
        Person per = new Person(“张三”,10) ;
        System.out.println(per.getInfo()) ;
    }
}

image.png
图一 执行结果一

这个时候对于程序而言方法就有了两种:static方法、非static方法。
这两个方法之间在调用上就有了限制。

  • static方法只允许调用static属性或static方法;
  • 非static方法允许调用static属性或static方法;

所有的static定义的属性和方法都可以在没有实例化对象的前提下使用,而所有的非static定义的属性和方法必须要有实例化对象的情况下才可以使用。
如果说可以理解这个限制(this.),那么对于之前的方法定义就可以得出新的结论:在最早讲解方法定义的时候强调过:“当前定义的方法都是在主类中定义的,并且由主方法调用的”。

public class JavaDemo {          
    public static void main(String args[]) {
        print() ;
}
    public static void print(){
       System.out.println(www.mldn.cn) ;
  }
}

image.png
图二 执行结果二

public class JavaDemo {          
    public static void main(String args[]) {
        new JavaDemo().print() ;
}
    public void print(){
        System.out.println(www.mldn.cn) ;
 }
}

image.png
图三 执行结果三

static 定义的方法或者是属性都不是你代码编写之初所需要考虑的内容,只有在回避实例化对象调用并且描述公共属性的情况下才会考虑使用static定义的方法或者是属性。

static应用

为了加强理解,下面做两个简单的程序来进行static应用的提示。
范例:编写一个程序类,这个类可以实现实例化对象个数的统计,每一次创建新的实例化对象都可以实现一个统计操作。
此时可以单独创建一个static属性,因为所有对象都共享同一个static属性,那么在构造方法中可以实现数据的统计处理。

class Book {
private String title ;
private static int count = 0 ;
public Book(String title) {
    this.title = title ;
    count ++ ;
    System.out.println(“第” + count + ”本新的图书创建出来。”)
}
}

public class JavaDemo {
  public static void main(String args[]) {
  new Book(“Java”) ;
  new Book(“JSP”) ;
  new Book(“Sping”) ;
}

image.png
图四 执行结果四

范例:实现属性的自动命名处理
如果现在传递了title属性,就使用传递的属性内容,而如果没有传递title属性,则自动采用“NOTITLE-编号”的形式进行该属性内容。

class Book {
   private String title ;
   private static int count = 0 ;
   public Book() {
      this(“NOTITLE - ”+ count ++)
   }
   public Book(String title) {
      this.title = title ;
      count ++ ;
   }
   public String getTitle() {
      return this.title ;
   }
}
public class JavaDemo {
    public static void main(String args[]) {
        System.out.println(new Book(“Java”).getTitle()) ;
        System.out.println(new Book(“JSP”).getTitle()) ;
        System.out.println(new Book(“Sping”).getTitle()) ;
        System.out.println(new Book().getTitle()) ;
        System.out.println(new Book().getTitle()) ;
   }
}

image.png
图五 执行结果五

这样处理的好处是可以避免在没有设置title属性时内容为null的重复问题。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:千字掌握“代码块”概念 | 带你学《Java面向对象编程》之十二
更多Java面向对象编程文章查看此处

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
+ 订阅

Java开发者成长课堂

官方博客
官网链接