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:如何使用成员变量和 ...
随机推荐
- 第70天:jQuery基本选择器(一)
一.jQuery基本选择器 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化javascript开发 jQuery能做的javascipt都能做到,而javascri ...
- BZOJ 1211 树的计数(purfer序列)
首先考虑无解的情况, 根据purfer序列,当dee[i]=0并且n!=1的时候,必然无解.否则为1. 且sum(dee[i]-1)!=n-2也必然无解. 剩下的使用排列组合即可推出公式.需要注意的是 ...
- CodeForces 632E Thief in a Shop
题意:给你n种物品,每种无限个,问恰好取k个物品能组成哪些重量.n<=1000,k<=1000,每种物品的重量<=1000. 我们搞出选取一种物品时的生成函数,那么只要对这个生成函数 ...
- Django 2.0 学习(09):Django 静态文件(样式和背景图片)
应用的定制化:静态文件 首先,在polls目录中创建一个名叫static的目录.Django会在该目录里面查找静态文件,类似于Django在polls/template目录下查找模板文件. Djang ...
- Codeforces Round #522 Div. 1 没打记
开场被A劝退,写了得有50min于是不敢交了.unrated了喜闻乐见. A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下 ...
- axios请求,拦截器的使用
1. axios 创建请求 import axios from 'axios' import {Message} from 'element-ui' import router from " ...
- BZOJ2816:[ZJOI2012]网络——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2816 https://www.luogu.org/problemnew/show/P2173 有一 ...
- BZOJ1898: [Zjoi2005]Swamp 沼泽鳄鱼(矩阵乘法)
1898: [Zjoi2005]Swamp 沼泽鳄鱼 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 Description 潘塔 ...
- Android HandlerThread分析
基础概念:HandlerThread 是一个包含 Looper 的 Thread,我们可以直接使用这个 Looper 创建 Handler,本质上还是Thread Handler 必须要和 Loope ...
- 任务调度 Quartz 学习(三) CronTrigger 表达式
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...