静态域:
如果将域定义为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)---静态域与静态方法的更多相关文章

  1. Java【基础学习】之暴力求素数【用数组返回】

    Java[基础学习]之暴力求素数[用数组返回] */ import java.util.*; public class Main{ public static void main(String[] a ...

  2. Java之基础学习(数据类型、运算符、分支语句和循环语句)

    在工作用得比较多的是shell和python编程,对于java以前也学习过,使用很少,这次借朋友推荐的java视频教程来温习下. 也是因为现在很多开源测试工具使用java编写的,学习一下更有助于测试工 ...

  3. Java入门基础学习,成为一个Java程序员的必备知识

    引言 众所周知,Java是一种面向对象的编程语言.您可以在Windows操作系统上编写Java源代码,而在Linux操作系统上运行编译后的字节码,而无需修改源代码. 数据类型 Java 有 2 种数据 ...

  4. Java语法基础学习DaySeven

    ---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean          byte——Byte ...

  5. JAVA多线程基础学习一:基础知识

    我们知道多线程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 一.线程基本概念 1 线程:进程中负责程序执行的执行单元(执行 ...

  6. Java JDBC基础学习小结

    JDBC是一个Java应用程序接口,作用是封装了对数据库的各种操作.JDBC由类和接口组成,使用Java开发数据库应用都需要4个主要的接口:Driver.Connection.Statement.Re ...

  7. Java语法基础学习DayNineteen(反射机制)

    一.Refection定义 1.概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  8. Java语法基础学习DayEighteen(常用类)

    一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...

  9. Java语法基础学习DaySeventeen(多线程续)

    一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...

  10. Java语法基础学习DayFour

    一.面向对象 1.特点: A:是一种更符合我们思考习惯的思想B:把复杂的事情简单化C:让我们从执行者变成了指挥者 2.使用: a:创建对象格式类名 对象名 = new 类名();b:如何使用成员变量和 ...

随机推荐

  1. 使用oledb读取excel表

    string path = "C:\\Users\\aaa\\Desktop\\aa.xls"; string conn = "Provider = Microsoft. ...

  2. BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)

    dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...

  3. Hadoop运行Jar文件时Output错误

    当第二次运行Jar程序时,出现Output文件已存在的Exception: Exception in thread "main" org.apache.hadoop.mapred. ...

  4. 【题解】51nod1327 棋盘游戏

    那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...

  5. redux的一些插件总结(redux-actions,reselect)

    redux本身还是过于简单,实际使用的时候需要配合许多插件. 下面是一些插件与vuex的功能对比 redux-actions <=> vuex的mutation的写法 reselect & ...

  6. js ajax向后台传数组可以直接拼接传输

    ajax向后台传数组是可以直接传的,写法如下 var ids = [ ]; $(dom1).each(function(){ ids.push($(this).val()); }); var  use ...

  7. UVA315:Network(求割点)

    Network 题目链接:https://vjudge.net/problem/UVA-315 Description: A Telephone Line Company (TLC) is estab ...

  8. FileProvider记录下

    Mark下FileProvider,阿里巴巴Android开发手册有如下要求:[强制]应用间共享文件时,不要通过放宽文件系统权限的方式去实现,而应使用FileProvider. 知识点记录:1. An ...

  9. android 自定义控件---圆形方向盘

    在做Android平台开发的时候,经常会遇到安卓原生控件无法满足需求的情况,安卓允许开发者去继承已经存在的控件或者实现你自己的控件. 先来看一下效果图 采用直接集成View类,重写onDrow方法绘制 ...

  10. C++智能指针 auto_ptr

    C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不 ...