面向对象基础07static关键字的使用以及单态设计模式.docx

上传人:b****6 文档编号:13721633 上传时间:2023-06-16 格式:DOCX 页数:29 大小:594.91KB
下载 相关 举报
面向对象基础07static关键字的使用以及单态设计模式.docx_第1页
第1页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第2页
第2页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第3页
第3页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第4页
第4页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第5页
第5页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第6页
第6页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第7页
第7页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第8页
第8页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第9页
第9页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第10页
第10页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第11页
第11页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第12页
第12页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第13页
第13页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第14页
第14页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第15页
第15页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第16页
第16页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第17页
第17页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第18页
第18页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第19页
第19页 / 共29页
面向对象基础07static关键字的使用以及单态设计模式.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

面向对象基础07static关键字的使用以及单态设计模式.docx

《面向对象基础07static关键字的使用以及单态设计模式.docx》由会员分享,可在线阅读,更多相关《面向对象基础07static关键字的使用以及单态设计模式.docx(29页珍藏版)》请在冰点文库上搜索。

面向对象基础07static关键字的使用以及单态设计模式.docx

面向对象基础07static关键字的使用以及单态设计模式

12.面向对象基础(07)

本季要点:

static关键字的使用。

本季讲解了Java中static关键字的使用以及单态设计模式。

blog:

[零基础学JAVA]JavaSE面向对象部分-12.面向对象基础(07)2009-01-05

上季内容回顾:

1、内部类 

2、对象数组的使用

本季主要知识点:

本季要点:

static关键字的使用。

本季讲解了Java中static关键字的使用以及单态设计模式。

static的使用

设计一个类:

Person类,有name、age、city三个属性

class Person 

  //为了方便,属性暂时不封装 

  Stringname; 

  int age; 

  //所在城市默认为南京 

  Stringcity= "南京" ; 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo01 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= 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属性了。

class Person 

  //为了方便,属性暂时不封装 

  Stringname; 

  int age; 

  //所在城市默认为南京 

  static Stringcity= "南京" ; 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo02 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= new Person("王五",32); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

  } 

};

再来看下内存结构

加入static声明之后所有的static类型的属性都保存在了全局数据区之中,所有的对象都共同拥有同一个city属性了。

class Person 

  //为了方便,属性暂时不封装 

  Stringname; 

  int age; 

  //所在城市默认为南京 

  static Stringcity= "南京" ; 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo03 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= new Person("王五",32); 

    System.out.println("----------修改city属性之前----------"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

    System.out.println("----------修改city属性之后----------"); 

    //通过一个对象修改city属性值 

    p1.city= "北京" ; 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

  } 

};

验证下效果

一个对象修改static属性之后,其他的所有对象都可以更改了。

 

但是以上的程序有一些不妥,一个城市改变是应该由某个人(某个对象)去做的吗?

应该是由对象的集合体去做,对象的集合体就是类,所以一般在访问static属性的时候都采用如下格式:

 

· 类名称.static属性     这是最合理的。

class Person 

  //为了方便,属性暂时不封装 

  Stringname; 

  int age; 

  //所在城市默认为南京 

  static Stringcity= "南京" ; 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo04 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= new Person("王五",32); 

    System.out.println("----------修改city属性之前----------"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

    System.out.println("----------修改city属性之后----------"); 

    //通过一个对象修改city属性值 

    //最好是通过类名称去修改static属性,即static属性可以被类名称直接访问 

    Person.city= "北京" ; 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

  } 

};

验证一下

有些时候也有人把static类型的属性称为类属性(类变量),因为可以直接由类名称进行访问。

既然static可以声明属性,则static也可以声明方法,使用static声明的方法称为类方法,也可以由类名称直接调用。

class Person 

  //为了方便,属性暂时不封装 

  private Stringname; 

  private int age; 

  //所在城市默认为南京 

  private static Stringcity= "南京" ; 

  //只编写一个可以修改city的方法 

  public static void setCity(Stringcity) 

  { 

    this.city=city; 

  } 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo05 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= new Person("王五",32); 

    System.out.println("----------修改city属性之前----------"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

    System.out.println("----------修改city属性之后----------"); 

    //通过一个对象修改city属性值 

    //最好是通过类名称去修改static属性,即static属性可以被类名称直接访问 

    //Person.city="北京"; 

    Person.setCity("无锡"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

  } 

};

这样验证下有没问题哈~

class Person 

  //为了方便,属性暂时不封装 

  private Stringname; 

  private int age; 

  //所在城市默认为南京 

  private static Stringcity= "南京" ; 

  //只编写一个可以修改city的方法 

  public static void setCity(Stringc) 

  { 

    //this是表示当前对象,static属性是绝对不能用this表示滴~ 

    //因为static属性不绝对属于某一个对象 

    //this.city=city;    ---->这是错误滴哈~~~ 

    city=c; 

  } 

  public Person(Stringname,int age) 

  { 

    this.name=name; 

    this.age=age; 

  } 

  public StringgetInfo() 

  { 

    return "姓名:

"+name+",年龄:

"+age+",城市:

"+city;    

  } 

}; 

public class Demo06 

  public static void main(Stringargs[]) 

  { 

    Personp1= new Person("张三",30); 

    Personp2= new Person("李四",31); 

    Personp3= new Person("王五",32); 

    System.out.println("----------修改city属性之前----------"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

    System.out.println("----------修改city属性之后----------"); 

    //通过一个对象修改city属性值 

    //最好是通过类名称去修改static属性,即static属性可以被类名称直接访问 

    //Person.city="北京"; 

    //使用static声明的方法可以直接使用类名称调用 

    Person.setCity("无锡"); 

    System.out.println(p1.getInfo()); 

    System.out.println(p2.getInfo()); 

    System.out.println(p3.getInfo()); 

  } 

};

看下程序效果

Static使用的限制:

 

1、使用static声明的方法能否访问static声明的属性呢?

允许的

class Demo07 

  static Stringname= "Michael" ; 

  public static void fun() 

  { 

    System.out.println(name); 

  } 

};

编译通过哈~

2、使用static方法能否访问非static声明的属性呢?

不允许的

class Demo08 

  Stringname= "Michael" ; 

  public static void fun() 

  { 

    System.out.println(name); 

  } 

};

编译不能通过,说明是不允许滴~~~

3、使用非static方法能否访问static声明的属性呢?

允许的

class Demo09 

  static Stringname= "Michael" ; 

  public void fun() 

  { 

    System.out.println(name); 

  } 

};

编译通过,说明是允许滴

4、使用非static能否访问非static声明的属性呢?

允许的

class Demo10 

  Stringname= "Michael" ; 

  public void fun() 

  { 

    System.out.println(name); 

  } 

};

这个编译也通过,说明也是允许滴

Main方法调用其他方法的问题:

 

·之前讲解方法的时候给了一个限制:

如果一个方法想被主方法直接调用,则此方法声明时必须加上publicstatic才可以。

public class Demo11 

  public static void main(Stringargs[]) 

  { 

    fun(); 

  } 

  public static void fun() 

  { 

    System.out.println(""); 

  } 

};

如果我们在fun()方法前没有加上static滴话,我们看下会报什么错误

public class Demo12 

  public static void main(Stringargs[]) 

  { 

    fun(); 

  } 

  public void fun() 

  { 

    System.out.println(""); 

  } 

};

注意:

static类型的方法只能调用static类型的方法

public class Demo13 

  //static类型的方法只能调用static类型的方法 

  public static void main(Stringargs[]) 

  { 

    //如果fun()方法前不加static,则只能这样调用 

    new Demo13().fun(); 

  } 

  public void fun() 

  { 

    System.out.println(""); 

  } 

};

程序执行正常

主方法的含义:

publicstaticvoidmain(Stringargs[])

理解main方法

Stringargs[]:

表示运行时的参数==>表示String类型的对象数组

public class Demo14 

  public static void main(Stringargs[]) 

  { 

    for (int i=0;i

    { 

      System.out.println(args[i]); 

    } 

  } 

};

我们发现没有内容输出哈,那我们在javacDemo14.java后面跟上几个数据哈,以空格分开

所有的参数会在命令后面加入空格的形式出现。

我们做个练习哈~

public class Demo15 

  public static void main(Stringargs[]) 

  { 

    //必须输入两个参数 

    if (args.length!

=2) 

    { 

      //表示不是两个参数,则要退出系统 

      System.out.println("运行参数不正确,正确的格式为:

"); 

      System.out.println("javaDemo15用户名密码"); 

      System.exit

(1); 

    } 

    //之后的程序就表示肯定已经成功的输入了用户名和密码哈~~~ 

    StringuserName=args[0]; 

    StringuserPasswd=args[1]; 

    //判断用户名是否为abc,密码是否为123哈~~~ 

    //为什么现在要用字符串.equals去判断而不是用username调用equals哈~ 

    //这样可以有效滴避免NullPointerException 

    if ("abc".equals(userName)&&"123".equals(userPasswd)) 

    { 

      System.out.println("欢迎访问哈~~~"); 

    } 

    else 

    { 

      System.out.println("用户名和密码不正确哈~~~"); 

    } 

  } 

};

验证一下程序

解释:

为什么要把字符串放在前面比较

public class Demo16 

  public static void main(Stringargs[]) 

  { 

    Stringstr= ""; 

    System.out.println(str.equals("")); 

  } 

};

程序执行下,看下有没问题哈~

结果为true,没有出错哈,但是大家知道str是引用数据类型哈,如果str值为null空的话,就会出现问题。

public class Demo17 

  public static void main(Stringargs[]) 

  { 

    Stringstr= null; 

    System.out.println(str.equals("")); 

  } 

};

程序提示NullPointerException错误哈~

那我们现在把str和字符串交换下位置看下效果

public class Demo18 

  public static void main(Stringargs[]) 

  { 

    Stringstr= null; 

    System.out.println("".equals(str)); 

  } 

};

字符串 永远

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2