staticvoidmain

生活经验017

本文目录

  1. C#中静态方法实例方法?
  2. public void show是什么方法?
  3. Java在linux上调用shell脚本?
  4. c#设计一个时间类(time),该类能显示时间,并对时,分,秒做加一和减一的操作?

C#中静态方法实例方法?

1.静态变量

在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用。但有些时候,这样做却不是个明智的选择。

staticvoidmain,第1张

假设我们要定义一个图书类,要求该类能保存图书的数量,即每增加一本图书(定义一个实例),图书的数量应该加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();

}

}

}