本文目录
C#中静态方法实例方法?
1.静态变量
在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用。但有些时候,这样做却不是个明智的选择。
假设我们要定义一个图书类,要求该类能保存图书的数量,即每增加一本图书(定义一个实例),图书的数量应该加1。如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)里,然而,这样的变量要在不同图书(实例)里重复存储,图书(实例)数量少的话,我们还能接受,如果图书(实例)数量较多的话,比如成千上万,我们无法想象这要造成多少资源(如内存、磁盘空间)的浪费,更让人无法忍受的是:因为图书(实例)的数量要保存在每本图书(实例)里,该值肯定是不同的。要使这些图书(实例)中保存的图书(实例)数量一致,我们必须在每增加一本新书(生成一个新实例)时,修改其他所有图书(实例)中保存的该值。Oh,My God!你会重新向往面向过程的程序设计方法,向往拥有全局变量的时代。但,这种局面不会出现,因为C#中为你准备好了另外一种变量类型:静态变量。它在类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。
静态变量的声明方式如下:
[访问修饰符] static 数据类型 变量名;
这里的访问修饰符跟类的其它成员一样,可以是public,protected,private或internal等。
静态变量又如何使用呢?
静态变量必须使用类名来引用,而不能使用类的实例,因为,静态变量不属于任何实例,而是共有的。我们可以打个比方:在一个班级中,有些物品是个人的,我们想使用时,必须指出物品的所有者,比如说“王三的自行车”,在C#程序中我们可以使用:王三.自行车的格式。有些物品是大家共有的物品,不能以个人名义使用,而是用班级的名义使用,比如班集体出资买的篮球,只能说:“班级的篮球”,而不能说:“王三的篮球”。这绝对是不行的,这对其他人绝对是不公平的,我们可以联想到许多贪官污吏就是使用了不属于自己的东西,或以个人名义使用公家的东西而葬送了自己。
说一句有用的就是:静态变量是用类名来引用它。即:类名.静态变量名;
举个具体的例子如下:
using System;
class StaticVar
{
public int x;
public static int y;
public void PrintInfo()
{
Console.WriteLine("非静态变量x={0}",x);
Console.WriteLine("静态变量y = {0}",y);
}
}
class Test
{
static void Main(string[] args)
{
StaticVar stv = new StaticVar();
stv.x
= 10;
//
stv.y
= 20; //error;无法使用实例引用访问静态成员“
StaticVar.y
”;改用类型名来限定它
StaticVar.y
= 20;
stv.PrintInfo();
}
}
程序中被注释的部分:
stv.y
= 20是使用实例引用静态变量,这将引发错误。
另外,我想说一句,对于静态变量在声明时,如果没有给出初始值或使用前没有赋任何值的话,系统会给他们一个默认值:对于整型数据默认值为0;单精度数据为:0.0f;双精度数据为0.0;布尔型数据为False;引用型数据为null。
2.静态方法
静态方法与静态变量一样,不属于任何特定的实例,属于类全体成员共有,由类名来调用。但要注意以下几点:
静态方法只能访问类的,不能访问类的非;
非静态方法可以访问类的静态成员,也可以访问类的非静态成员;
静态方法不能使用实例来调用,只能使用类名来调用。这里用一个具体的例子来说明:
using System;
namespace TestStatic
{
class StaticTest
{
int x;
static int y;
public StaticTest(int a,int b)
{
x = a;
y = b;
}
public void SimplePrint()
{
Console.WriteLine("x="+x+",y="+y);
}
public static void StaticPrint()
{
Console.WriteLine("y={0}",y);
// Console.WriteLine("x={0}",x); //静态方法中不能使用非静态成员
}
}
class Test
{
static void Main(string[] args)
{
StaticTest st = new StaticTest(10,23);
st.SimplePrint();
//st.StaticPrint(); //静态方法不能使用实例来调用
StaticTest.StaticPrint();
}
}
}
public void show是什么方法?
public void show(){ System.out.println("the age is "+getName();); } class Test(){ public static void main(String [] args) { Person p =new Person(); p.getName("王吴"); p.show().}}
Java在linux上调用shell脚本?
近期正好结合工作实践,分享了一篇关于Java如何调用Shell的文章,希望能够帮到您。内容如下。
《Java 配 Shell 等于美酒加咖啡》
化学中我们得知「氢气加氧气在点燃的情况下会生成水」。
生活中我们得知「良辰加美景的情况下会得到千金春宵一刻」。
技术上又何尝不是如此呢?先假设一个场景:BOSS 让你实现一个服务监控的指挥室,能看到每个服务器的磁盘剩余空间,能看到。。。能看到。。。
其实讲真,实现思路有很多,但是不管黑猫白猫能抓住老鼠都是好猫,今天我们尝试用 Java 与 Shell 搭配一下,看看是否会产生惊奇的反应。
1. 首先通过 JDK 源码,品一品 Runtime 这杯美酒。
上图是摘取 JDK 中 Runtime 的部分源码,主要分成 4 大代码段来粗略认识她。
第一块代码段,可以看出 Runtime 构造私有化,提供了静态属性,并提前创建对象实例,并提供获取实例的静态方法,这不就是单例设计模式的使用么,当有面试官再问设计模式,拿去狂喷。
第二块代码段,主要是 addShutdownHook() 方法,添加关闭的钩子,说的直白点,其实允许研发人员插入一段在 JVM 关闭时执行的代码。例如在搭建服务框架时,面对需要完成优雅停服,打扫战场,释放资源等等,诸如此类的场景下都很有用。其中在 Tomcat、Jetty 等容器中都可以看到 shutdownHook 的身影。
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("打扫战场,释放资源,完成优雅停服");
}
});
System.out.println("服务启动完成");
代码运行效果如下。
服务启动完成
打扫战场,释放资源,完成优雅停服
第三块代码段,主要展现 JDK 针对 Runtime 提供的系列 exec 重载方法,这个是本次分享的重点,重头戏最后再说。
第四块代码段,主要是 Runtime 提供的一些获取系统信息的 API,直接抛代码,拿去用就行了。
Runtime runtime = Runtime.getRuntime();
System.out.println(String.format("JVM可用本机CPU内核数 %d", runtime.availableProcessors()));
//默认为系统的1/4
System.out.println(String.format("最大可用内存空间 %d M", runtime.maxMemory() / 1024 / 1024));
//默认为系统的1/64
System.out.println(String.format("可用内存空间 %d M", runtime.totalMemory() / 1024 / 1024));
System.out.println(String.format("空闲内存空间 %d M", runtime.freeMemory() / 1024 / 1024));
代码运行输出如下,其实真实环境中不妨用模板引擎 FreeMarker 渲染,然后通过邮件告警,实现的逼格高一些。
2. 在详细说 Runtime.exec() 这个重头戏之前,再品一品 df 这款咖啡。
Linux df 命令,用于显示目前在系统上的磁盘使用情况统计,主要用于查看磁盘的分区,磁盘已使用的空间,剩余的空间。
命令如下:
df [选项]... [FILE]...
常用选项如下:
3. Runtime 美酒加 Shell 咖啡会发生什么呢?
重头戏开始,回到 Runtime 的源码,我们看到 exec() 系列方法会帮我们启动一个 Process 进程,那不妨把 df -h 命令传入进去一探究竟。
public class Foo {
public static void main(String[] args) throws Exception {
//df命令用于查看磁盘的分区,磁盘已使用的空间,剩余的空间
//df -h以合适的单位来显示信息
System.out.println(exec("df -h"));
}
private static String exec(String command) throws Exception {
String[] cmd = {"/bin/sh", "-c", command};
StringBuilder out = new StringBuilder();
BufferedReader reader = null;
InputStream in = null;
try {
Process process = Runtime.getRuntime().exec(cmd);
in = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
out.append(line + "\n");
}
process.waitFor();
} finally {
if (reader != null) {
reader.close();
}
}
return out.toString();
}
}
代码中会发现调用了 process 的 waitFor() 方法,此方法作用会导致当前线程等待,一直要等到由该 Process 对象表示的进程终止,其实也就是等待把 exec 里面启动的 Process 中的所有事都干完(生产上出问题的大多出在这儿),代码运行效果如下。
效果确实可以,那么这么一来,想监控统计什么功能,不妨直接把命令交给 Java 程序去执行即可。
4.
如果关注一猿小讲的伙伴应该清楚,在《如何让Java应用成为杀不死的小强?(中篇)》《如何让Java应用成为杀不死的小强?(下篇)》两篇中都用到了 ProcessBuilder 来执行命令启动进程,那 Runtime 与 ProcessBuilder 的主要区别是啥呢?
其实 Runtime.exec() 方法设计,可接受一个单独的字符串,这个字符串是通过空格来分隔可执行命令程序和参数的;当然也可以接受字符串数组参数。
如上图所示,ProcessBuilder 的方法入参是一个List<String>或者多个字符串。
相同点是 ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作)。
5. 好了,几分钟的简单分享,主要让你接触并真正认识一下 Runtime,希望能帮助你在工作中锦上添花。
最后依然用阿里新六脉神剑中的三脉送给大家:今天最好的表现是明天最低的要求;此时此刻非我莫属;认真生活快乐工作!
c#设计一个时间类(time),该类能显示时间,并对时,分,秒做加一和减一的操作?
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo5
{
class Time
{
private int hour;
private int minute;
private int second;
public Time(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
public void IncrementHour()
{
if (this.hour < 23)
{
this.hour++;
}
else
{
this.hour = 0;
}
}
public void DecrementHour()
{
if (this.hour > 0)
{
this.hour--;
}
else
{
this.hour = 23;
}
}
public void IncrementMinute()
{
if (this.minute < 59)
{
this.minute++;
}
else
{
this.minute = 0;
IncrementHour();
}
}
public void DecrementMinute()
{
if (this.minute > 0)
{
this.minute--;
}
else
{
this.minute = 59;
DecrementHour();
}
}
public void IncrementSecond()
{
if (this.second < 59)
{
this.second++;
}
else
{
this.second = 0;
IncrementMinute();
}
}
public void DecrementSecond()
{
if (this.second > 0)
{
this.second--;
}
else
{
this.second = 59;
DecrementMinute();
}
}
public void Display()
{
Console.WriteLine("{0}:{1}:{2}", hour, minute, second);
}
}
class Program
{
static void Main(string[] args)
{
Time time = new Time(22, 33, 20);
time.Display();
// 小时加1
time.IncrementHour();
time.Display();
// 小时减1
time.DecrementHour();
time.Display();
// 分钟加1
time.IncrementMinute();
time.Display();
// 分钟减1
time.DecrementMinute();
time.Display();
// 秒加1
time.IncrementSecond();
time.Display();
// 秒减1
time.DecrementSecond();
time.Display();
Console.ReadKey();
}
}
}