面向对象基础07static关键字的使用以及单态设计模式.docx
- 文档编号:13721633
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:29
- 大小:594.91KB
面向对象基础07static关键字的使用以及单态设计模式.docx
《面向对象基础07static关键字的使用以及单态设计模式.docx》由会员分享,可在线阅读,更多相关《面向对象基础07static关键字的使用以及单态设计模式.docx(29页珍藏版)》请在冰点文库上搜索。
面向对象基础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)); } }; 字符串 永远
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 基础 07 static 关键字 使用 以及 设计 模式