18天Java学习---12.面向对象编程07-Java中的static关键字用法
来源:互联网 发布:软件怎开发的 编辑:程序博客网 时间:2024/04/30 08:00
static关键字应用点有3个: static变量(属性)的声明及引用、static方法的声明及引用以及static代码块的使用. 貌似静态代码块的使用机会比较少,这块跨过~ 主要笔记下前面两个部分.
1. static 属性(变量)的声明及引用
static属性是指把公共属性(也就是说,所有对象都一样的那个属性)单独列出来,用static加以静态化的属性. 这里需要先解释下, 为什么需要静态属性.
先看下面的例子代码:
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属性.这在下面会接着说到.
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修饰方法,也可以直接由类名称直接访问. 例子可以参照下面程序,注意注释部分:
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()来实例化对象了...
public
class
Demo09{
// static类型的方法只能调用static类型的方法
public
static
void
main(String args[]){
new
Demo09().fun() ;
}
public
void
fun(){
System.out.println(
"HELLO WORLD!!!"
) ;
}
}
- 18天Java学习---12.面向对象编程07-Java中的static关键字用法
- static关键字-java面向对象
- java--面向对象static关键字
- java学习日记_25:面向对象之static关键字
- 十 java面向对象程序设计(static关键字)
- java面向对象(八) static关键字
- Java 面向对象之static关键字
- Java面向对象(3)static关键字
- Java面向对象笔记(六)static关键字
- 学习Java面向对象-static
- 18天Java学习---9.面向对象编程04-this关键字的使用
- java 中的 final 关键字 和 static 用法
- java static关键字用法
- Java关键字static用法
- 18天Java学习---15.面向对象编程10-Java中final关键字,抽象类与接口
- java学习笔记-static关键字的用法
- Java学习-static关键字的用法
- 黑马程序员---java基础---面向对象中的构造方法及static关键字,变量的问题
- 如何禁止windowsxp启动时检测硬盘?
- Javascript 操作select控件大全
- Android Contacts的使用
- C++著名程序库的比较和学习经验
- JavaScript中的事件委托
- 18天Java学习---12.面向对象编程07-Java中的static关键字用法
- 挂起一段时间的函数--Sleep函数
- Squid
- 18天Java学习---13.面向对象编程08-Java中继承的概念,子类实例化过程,super()及方法复写
- IIS集成配置
- 实例讲解编译过程
- Known Free Software Android Applications
- Android APK反编译得到Java源代码和资源文件
- Recursive function convert to Non-Recursive function