java===java基础学习(8)---静态域与静态方法
静态域:
如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,加入需要给每一个雇员赋予唯一的标识码。这里给的Employee类添加一个实例域id和一个静态域nextId:
class Employee
{
private static int nextId = 1;
private int id;
}
现在。每个雇员对象都有一个自己的id域。但这个类的所有实例将共享一个nextid域。换句话说,如果有1000个Employee类的对象,则有1000个实例域id。但是。只有一个静态域nextId。即使没有一个雇员对象,静态域nextId也是存在的。它属于类,而不属于任何独立的对象、
下面一个简单的方法:
public void setId()
{
id = nextId;
nextId++;
}
假定为harry设定雇员标识码:
harry.setId();
harry的id域被设置为静态域nextId当前的值,并且静态域nextId的值加1:
harry.id = Employee.nextId;
Employee.nextId++;
静态常量:
静态变量使用得比较少,但是静态常量却使用的比较多。例如,在Math类中定义了一个静态常量:
public class Math
{
public static final double PI = 3.1415926535897932384624;
}
在程序中,可以采用Math.PI的形式或者这个常量。
如果关键字static被省略,PI就变成了Math类的实例域。需要通过Math类的对象访问PI,并且每一个Math对象都有他自己的一份PI拷贝。
#这句话的理解:加了static,不用创建类的对象,就可以直接调用类里面对应的数据。但是static去掉,必修创建类的实例。才能访问
静态方法:
静态方法是一种不能向对象实施操作的方法。例如,Math类的pow方法就是一个静态方法。表达式:
Math.pow(x, a)
不使用任何Math对象。换句话讲,就是没有隐式的参数。
可以认为静态方法是没有this参数的方法。
Employee类中的静态方法不能访问Id实例域,因为它不能操作对象。但是,静态方法可以访问自身类中的静态域。下面是使用这种静态方法的一个示例:
public static int getNextId()
{
return nextId; //return static field
}
可以通过类名调用这个方法:
int n = Employee.getNextId();
注释:可以使用对象调用静态方法。例如,如果harry是一个 Employee对象,可以用harry. getnextld()代替Employee. getnextld()。不过,这种方式很容易造成混淆,其原因是 getnextld方法计算的结果与 harry毫无关系。我们建议使用类名,而不是对象来调用静态方法。
下面两种情况下使用静态方法:
* 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。例如(Math.pow())
* 一个方法只需要访问类的静态域(例如:Employee.getNextId)
main方法:
不需要使用对象调用静态方法。例如,不需要构造Math类对象就可以调用Math.pow
同理,main方法也是一个静态方法。
public class Application
{
public static void main(String[] args)
{
// construct objects here
... ...
}
}
main 方法不对任何对象作操作。事实上,在启动程序时候还没有任何一个对象。静态的main方法将执行并创建程序所需要的对象。
提示: 每一个类可以有一个main方法。这是一个常用于对类进行单元测试的技巧。例如,可以在Employee类中添加一个main方法:
package testbotoo;
public class StaticTest {
public static void main(String[] args){ //unit test
Employee[] staff = new Employee[3];
staff[0] = new Employee("tom",123);
staff[1] = new Employee("jin", 234);
staff[2] = new Employee("jack", 899);
for(Employee e : staff)
{
e.setId();
System.out.println("name="+e.getName()+",salary="+e.getSalary()+",id="+e.getId());
}
}
}
class Employee
{
private static int nextId = 1;
private String name;
private double salary;
private int id;
public Employee(String n, double s)
{
name = n;
salary = s;
id = 0;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public int getId()
{
return id;
}
public void setId()
{
id = nextId; //set id to next available id
nextId++;
}
public static int getNextId()
{
return nextId; //return static field
}
public static void main(String[] args)
{
Employee e = new Employee("Herry", 10);
System.out.println(e.getName()+" "+e.getSalary());
}
}
java===java基础学习(8)---静态域与静态方法的更多相关文章
- Java【基础学习】之暴力求素数【用数组返回】
Java[基础学习]之暴力求素数[用数组返回] */ import java.util.*; public class Main{ public static void main(String[] a ...
- Java之基础学习(数据类型、运算符、分支语句和循环语句)
在工作用得比较多的是shell和python编程,对于java以前也学习过,使用很少,这次借朋友推荐的java视频教程来温习下. 也是因为现在很多开源测试工具使用java编写的,学习一下更有助于测试工 ...
- Java入门基础学习,成为一个Java程序员的必备知识
引言 众所周知,Java是一种面向对象的编程语言.您可以在Windows操作系统上编写Java源代码,而在Linux操作系统上运行编译后的字节码,而无需修改源代码. 数据类型 Java 有 2 种数据 ...
- Java语法基础学习DaySeven
---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean byte——Byte ...
- JAVA多线程基础学习一:基础知识
我们知道多线程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 一.线程基本概念 1 线程:进程中负责程序执行的执行单元(执行 ...
- Java JDBC基础学习小结
JDBC是一个Java应用程序接口,作用是封装了对数据库的各种操作.JDBC由类和接口组成,使用Java开发数据库应用都需要4个主要的接口:Driver.Connection.Statement.Re ...
- Java语法基础学习DayNineteen(反射机制)
一.Refection定义 1.概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...
- Java语法基础学习DayEighteen(常用类)
一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...
- Java语法基础学习DaySeventeen(多线程续)
一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...
- Java语法基础学习DayFour
一.面向对象 1.特点: A:是一种更符合我们思考习惯的思想B:把复杂的事情简单化C:让我们从执行者变成了指挥者 2.使用: a:创建对象格式类名 对象名 = new 类名();b:如何使用成员变量和 ...
随机推荐
- Delphi 模式窗体返回值ModalResult的使用方法及注意事项
1.基础知识简介: ModalResult是指一个模式窗体(form.showmodal)的返回值,一般用于相应窗体上按钮的ModalResult属性: 显示完窗体(关闭)后,会返回此属性预设的值做为 ...
- arc076 F - Exhausted? (霍尔定理学习)
题目链接 Problem Statement There are M chairs arranged in a line. The coordinate of the i-th chair ($$$1 ...
- Go语言【第八篇】:Go语言变量作用域
Go语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围,Go语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量: 函数外定义的变量称为全局变量: 函数 ...
- BZOJ4770 图样(概率期望+动态规划)
考虑求出所有MST的权值和再除以方案数,方案数显然是2mn. 按位考虑,显然应该让MST里的边高位尽量为0.那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条 ...
- NetScaler VLAN’s Demystified
NetScaler VLAN’s Demystified https://www.citrix.com/blogs/2014/12/29/netscaler-vlans-demystified/ Th ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- bzoj2165: 大楼 (矩阵快速幂)
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- POJ2074:Line of Sight——题解
http://poj.org/problem?id=2074 题目大意:(下面的线段都与x轴平行)给两条线段,一个点在其中一条线段看另一条线段,但是中间有很多线段阻挡视线.求在线段上最大连续区间使得在 ...
- React注释
React中注释有以下三种 var content = ( <Nav> {/* 一般注释, 用 {} 包围 */} <Person /* 多 行 注释 */ name={window ...
- HDU 5651 逆元
xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...