static关键字应用点有3个: static变量(属性)的声明及引用、static方法的声明及引用以及static代码块的使用. 貌似静态代码块的使用机会比较少,这块跨过~ 主要笔记下前面两个部分.
--------------------------------------------------------------------------------
1. static 属性(变量)的声明及引用
static属性是指把公共属性(也就是说,所有对象都一样的那个属性)单独列出来,用static加以静态化的属性. 这里需要先解释下, 为什么需要静态属性.
先看下面的例子代码: view plaincopy to clipboardprint?
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()) ;
}
}
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属性.这在下面会接着说到. view plaincopy to clipboardprint?
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());
}
}
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修饰方法,也可以直接由类名称直接访问. 例子可以参照下面程序,注意注释部分: view plaincopy to clipboardprint?
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());
}
}
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()来实例化对象了... view plaincopy to clipboardprint?
public class Demo09{
// static类型的方法只能调用static类型的方法
public static void main(String args[]){
new Demo09().fun() ;
}
public void fun(){
System.out.println("HELLO WORLD!!!") ;
}
}
发表评论
-
Servlet
2010-08-20 11:28 4951.什么是Servlet? ... -
MyEclipse快捷键
2010-08-20 11:27 521存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取 ... -
java面试题
2010-08-20 11:26 475第一,谈谈final, finally, finalize的区 ... -
Java学习笔记---16.面向对象编程11-Java多态性,instanceof及Object类
2010-08-20 11:26 690多态是一个之前一直搞不清楚的概念,通过这次笔记,对多态的概念及 ... -
Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
2010-08-20 11:24 936抽象类与接口是Java中最重要部分之一,这里用较大的篇幅来做下 ... -
Java学习笔记---14.面向对象编程09-Java中重载与复写的区别、super与this的比较
2010-08-20 11:22 8211. 方法重载与方法复写的区别 区别 ... -
Java学习笔记---13.面向对象编程08-Java中继承的概念,子类实例化过程,super()及方法复写
2010-08-20 11:12 1001继承是OOP的三大特点之一. 这一节主要做一下继承的笔记. ... -
Java学习笔记---11.面向对象编程06-Java的内部类及对象数组
2010-08-20 11:04 8291. Java的内部类机制 所谓内部类,是指在一 ... -
java学习笔记---10.面向对象编程05-面向对象程序的设计步骤
2010-08-20 11:03 771这一部分需要注意一个原则, 熟练掌握OOP的程序设计方法. ... -
Java学习笔记---9.面向对象编程04-this关键字的使用
2010-08-20 11:00 729Java学习笔记---9.面向对象编程04-this关键字的使 ... -
Java学习笔记---8.面向对象编程03-String类的重点应用
2010-08-20 10:59 694在String类这一部分很重要,分为三个问题来做笔 ... -
Java学习笔记---7.面向对象编程02-类的封装性以及构造方法
2010-08-20 10:57 7921. 类的封装特性: 类的封装性是指类 ... -
Java学习笔记---6.面向对象编程01-类对象的构建及对象的引用传递
2010-08-20 10:54 667Java学习笔记---6.面向对象编程01-类对象的构建及对象 ... -
Java学习笔记---5.Java数组和方法
2010-08-20 10:53 7151. 数组的声明语法 Java中数组的声明有两种形 ... -
Java学习笔记---4.Java的分支循环语句
2010-08-20 10:51 690switch的使用如下例: view plain ... -
Java学习笔记---3.运算符与表达式
2010-08-20 10:49 679这一部分需要再强调的东西不多,因为运算符表达式都是平时最常用的 ... -
Java学习笔记---2.Java标识符和基本数据类型
2010-08-20 10:48 929这一块里面,标识符比较简单,没有什么需要记录的东西. ... -
Java学习笔记---1.Java发展及JDK配置
2010-08-20 10:47 768Java的老东家是Sun公司(Sun的全名,Stanford ...
相关推荐
在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...
JAVA学习笔记-java学习笔记WORD样式.docx
java中的static关键字的作用及应用场景
Java 版设计模式学习笔记-java-design-patterns
Java基础每日复习笔记-JavaSE高级阶段.2020-10-13-211312.edf
Java学习笔记->1.关键字、变量以及常量.md
Java学习笔记-面向对象-001-面向对象概括 还会继续上传后续文本 详情访问http://www.feifeiblog.com/
Java并发编程与高并发解决方案-学习笔记-www.itmuch.com
2023-04-06-项目笔记-第一阶段- 6 注释 7.选择语句 7.1选择语句的使用 7.1选择语句的使用1 8.循环语句 8.1while循环的实例 9.函数 9.1函数的使用 10.数组 10.1.数组的使用 11.操作符 11.1操作符的使用 12. 常见...
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...
java学习笔记--PrintStream分享.pdf
Python金融大数据挖掘与分析全流程详解-学习笔记及案例代码.zip Python金融大数据挖掘与分析全流程详解-学习笔记及案例代码.zip Python金融大数据挖掘与分析全流程详解-学习笔记及案例代码.zip Python金融大数据挖掘...
java学习笔记---从入门到精通之路.pdf
Java学习笔记-Java后来者.exe
LaTex教程--latex排版学习笔记---入门提高.pdf
常见关键字 12.1关键字 typedef 12.2关键字static 12.2.1修饰局部变量 12.2.2修饰全局变量 12.2.3修饰函数 13.#define 定义常量和宏 14.指针 14.1内存 14.2指针的使用实例 14.3指针变量的大小 15.结构体
JAVA学习笔记,java知识点总结
新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.pdf 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记五--...
6.1. 面向对象与面向过程 6-11 6.2. 对象的概念 6-12 6.3. 成员变量和局部变量 6-12 6.4. 成员方法 6-12 6.5. This关键字 6-13 6.6. 访问控制符 6-13 6.7. 构造方法 6-13 6.8. 数据和方法的隐藏―――封装 6-14 6.9....