导航:首页 > 编程语言 > java类域

java类域

发布时间:2024-10-11 21:59:06

‘壹’ java怎么获取本机的用户名或域

java怎么获取本机的用户名或域可通过System.getEnv()得到。
System.getenv("USERNAME");System.getenv("USERDOMAIN");
它常和System.getProperties()配合使用,它们的区别是:
从概念上讲,系统属性 和环境变量 都是名称与值之间的映射。两种机制都能用来将用户定义的信息传递给 Java 进程。环境变量产生更多的全局效应,因为它们不仅对Java 子进程可见,而且对于定义它们的进程的所有子进程都是可见的。在不同的操作系统上,它们的语义有细微的差别,比如,不区分大小写。因为这些原因,环境变量更可能有意料不到的副作用。最好在可能的地方使用系统属性。环境变量应该在需要全局效应的时候使用,或者在外部系统接口要求使用环境变量时使用(比如 PATH)。

Map<String, String> map = System.getenv();
String userName = map.get("USERNAME");// 获取用户名
String computerName = map.get("COMPUTERNAME");// 获取计算机名
String userDomain = map.get("USERDOMAIN");// 获取计算机域名

System.out.println("自定义变量getenv CONF_LOCATION:" +System.getenv("conf.location"));
System.out.println("操作系统的名称:"+System.getProperty("os.name"));

其它常用的属性参数如下:
java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.specification.name Java 虚拟机规范名称 java.vm.version Java 虚拟机实现版本 java.vm.vendor Java 虚拟机实现供应商 java.vm.name Java 虚拟机实现名称 java.specification.version Java 运行时环境规范版本 java.specification.vendor Java 运行时环境规范供应商 java.specification.name Java 运行时环境规范名称 java.class.version Java 类格式版本号 java.class.path Java 类路径 java.library.path 加载库时搜索的路径列表 java.io.tmpdir 默认的临时文件路径 java.compiler 要使用的 JIT 编译器的名称 java.ext.dirs 一个或多个扩展目录的路径 os.name 操作系统的名称 os.arch 操作系统的架构 os.version 操作系统的版本 file.separator 文件分隔符(在 UNIX 系统中是“/” ) path.separator 路径分隔符(在 UNIX 系统中是“:” ) line.separator 行分隔符(在 UNIX 系统中是“/n” ) user.name 用户的账户名称 user.home 用户的主目录 user.dir 用户的当前工作目录

‘贰’ java 数组也算一个类吗

不管在其他语言中是什么,数组在Java中可得看作一个对象,它有一些值得探讨的特性。

Java中的数组其实是一个对象,但是确实是一个特殊的对象,实在是太特殊了,以致我们都不好把它多做对象处理。

java是纯面向对象的语言,数组也是一个对象。

首先我们看一下表面现象,数组创建的时候采用的是如下语句:
MyClass[] arr = new MyClass[9];

而普通类采用的是如下语句:
MyClass obj = new MyClass();

就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。

2)java中数组是对象的依据:

数组的父类是Object,
new Object[0].getClass().getSuperClass() 是Object.class

数组没有对应的类文件,String对应String.class.数组却没有,而且他们的 类名字很古怪,可以这样获得 new int[2].getClass().getName();
这是和其他对象最大的不同点,因为数组类是在运行时生成的。

java.lang.reflect.Array是final的,所以数组肯定不是它的子类,这个类用来动态生成数组或者操作数组(获得长度等)

再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。还是用上面的例子说明:
可以通过以下方法得到MyClass[]的Class实例:arr.getClass()或MyClass[].class。这样,我就可以向数组类里面“窥探”了。
Class clazz = MyClass[].class;
System.out.println(clazz.getConstructors().length);
打印出来的结果是0;证明数组类确实没有构造方法。

数组类的“庐山真面目”:
System.out.println(clazz);
输出是:
[Larraytest.MyClass

对Java
Class文件结构稍有了解就知道,这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说,数组类型不是和普通类
一样,以一个全限定路径名+类名来作为自己的唯一标示的,而是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通
类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候,
肯定会做出区分。我猜想,可能会有专门的java虚拟机指令来处理数组。

分析到这里,基本上可以肯定:java对数组对象化的操作的支持是指令级的,也就是说java虚拟机有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的,其结构与普通java类的Class实例有一些不同。

JDK API中有一个java.lang.reflect.Array类,这个类提供了很多方法(绝大多数是native方法,这在另一个方面证明了java对数组的支持是专用指令支持的,否则用本地方去干嘛,用来弥补我们对数组操作的局限性。

下面这句话用来创建一个一维的、长度为10的、类型为arraytest.MyClass的数组:
arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);

下面这句话用来创建一个二维的、3乘5的、类型为arraytest.MyClass的数组:
int[] arrModel = new int[]{3,5};
Object arrObj = Array.newInstance(Sub.class, arrModel);
当然你可以用一个数组的引用指向上面的二维数组,这里我们用一个Object的引用指向他。
使用的时候,我们也是可以利用Array类提供的方法来实现:

System.out.println(Array.getLength(arrObj);//第一维长度为3
System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二维长度为5,这里如果写3,就会得到你意想之中的java.lang.

打印结果是如我所想的:
3
5

对于数组的Class类实例,还有一些奇怪的现象:
在运行代码 java.lang.reflect.Field fieldarr =
clazz.getField("length");的时候,会抛出异常:java.lang.NoSuchFieldException:
length,这似乎在说数组类没有length这个域,而这个域其实是我们用的最多的一个(也就是说这个域是肯定存在的)。我想关于数组的Class类
实例、数组的实现等,还有很多“猫腻”在里面。

顺便说一句,java数组最多只能是255维的。这个让人看到了C的影子,嘿嘿。

“Java把数组当作一个java类来处理”说起来容易,用起来自然,但是细细想来,还是有很多不简单的地方呀。

从对数组对象的进一步探讨,可以稍微了解Java对对象处理的一些方法。首先来看看一维数组的引用名称的定义:

int[] arr = null;

在这个定义中,arr表示一个可以参考引用自一维数组对象的变量名称,但是目前将这个名称参考引用自null,表示还没有指定这个名称参考引用自实际的对
象。在Java中,=运算用于基本数据类型时,是将值复制给变量,但当它用于对象时,则是将对象指定给参考引用名称来参考引用。也可以将同一个对象指定给
两个参考引用名称,当对象的值由其中一个参考引用名称进行操作而变更时,另一个参考引用名称所参考引用到的值也会变动。下面来看看范例5.8的示范。

ü 范例5.8 AdvancedArray.java

public class AdvancedArray {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] tmp1 = arr1;

int[] tmp2 = arr1;

System.out.print("通过tmp1取出数组值:");

for(int i = 0; i < tmp1.length; i++)

System.out.print(tmp1[i] + " ");

System.out.print("\n通过tmp2取出数组值:");

for(int i = 0; i < tmp2.length; i++)

System.out.print(tmp2[i] + " ");

tmp1[2] = 9;

System.out.print("\n\n通过tmp1取出数组值:");

for(int i = 0; i < tmp1.length; i++)

System.out.print(tmp1[i] + " ");

System.out.print("\n通过tmp2取出数组值:");

for(int i = 0; i < tmp2.length; i++)

System.out.print(tmp2[i] + " ");

System.out.println();

}

}

执行结果:

通过tmp1取出数组值:1 2 3 4 5

通过tmp2取出数组值:1 2 3 4 5

通过tmp1取出数组值:1 2 9 4 5

通过tmp2取出数组值:1 2 9 4 5

在这个范例中,通过tmp1名称改变了索引2的元素值,由于tmp2也引用自同一数组对象,所以tmp2取出索引2的元素值是改变后的值。事实上在范例
5.8中,有三个引用名称引用自同一个数组对象,也就是arr1、tmp1与tmp2,所以,如果取出arr1索引2的元素,元素值也会是9。

了解到在Java中数组是一个对象,而使用=指定时是将对象指定给数组名来引用,而不是将数组进行复制。如果想将整个数组的值复制给另一个数组该如
何作呢?可以使用循环,将整个数组的元素值遍历一遍,并指定给另一个数组相对应的索引位置。范例5.10示范了进行数组复制的方法。

Ü范例5.10 ArrayCopy.java

public class ArrayCopy {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] arr2 = new int[5];

for(int i = 0; i < arr1.length; i++)

arr2[i] = arr1[i];

for(int i = 0; i < arr2.length; i++)

System.out.print(arr2[i] + " ");

System.out.println();

}

}

执行结果:

1 2 3 4 5

另一个进行数组复制的方法是使用System类提供的array()方法。其语法如下:
System.array(来源, 起始索引, 目的, 起始索引, 复制长度);

范例5.11改写了范例5.10,使用System.array()进行数组复制,执行结果与范例5.10是相同的。

Ü范例5.11 ArrayCopy2.java

public class ArrayCopy2 {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] arr2 = new int[5];

System.array(arr1, 0, arr2, 0, arr1.length);

for(int i = 0; i < arr2.length; i++)

System.out.print(arr2[i] + " ");

System.out.println();

}
}

四、 Java中的数组作为对象带来的好处
1)越界检查

2)length field:与传统的C++中的数组相比,length字段可以方便的得到数组的大小;但要注意,仅仅可以得到数组的大小,不能得到数组中实际包含多少个元素,因为length 只会告诉我们最多可将多少元素置入那个数组。

3) 初始化:对象数组在创建之初会自动初始化成null,由原始数据类型构成的数组会自动初始化成零(针对数值类型),(Char)0 (针对字符类型)或者false (针对布尔类型)。

4) 数组作为返回值:首先,既然数组是对象,那么就可以把这个对象作为返回值;而且,不必担心那个数组的是否可用只要需要它就会自动存在而且垃圾收集器会在我们完成后自动将其清除

‘叁’ java的接口、类、属性、方法各有哪些修饰符

1、 接口的修饰符只有:public 2、 类的修饰符分为:可访问控制符和非访问控制符两种。 可访问控制符是:公共类修隐氏手饰符 public 非访问控制符有:抽象类修饰符 abstract ;最终类修饰符 final 1、公共类修饰符public: Java 语言中类 的可访问控制符只有一个: public 即公共的。每个 Java 程序的主类都必须是 public 类作为公共工具供其它类和程序使用的应定义为 public 类。 2 、抽象类修饰符abstract:凡是用 abstract 修饰符修饰的类,被称为抽象类。所谓抽象类是指这种类没有具体对象的一种概念类。这样的类就是 Java 语言的 abstract 类。 3、最终类修饰符final:当一个类不可能有子类时可用修饰符 final 把它说明为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。 4、类缺省访问控制符:如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性。 3、属性的控制修饰符也分为:可访问控制符和非访问控制符两类。 可访问控制符有 4 种:公共访问控制符: public ;私有访问控制符: private ;保护访问控制符: protected ;私有保护访问控制符: private protected 非访问控制符有 4 种:静态域修饰符: static ;最终域修饰符: final ;易失 ( 共享 ) 域修饰符: volatile ;暂时性域修饰符: transient 1、公共访问控制符 public :用 public 修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其它类所引用。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。 2、私有访问控制符 private : 用 private 修饰的成员变量 ( 域 ) 只能被该类自身所访问,而不能被任何其它类 ( 包括子类 ) 所引用。 3、保护访问控制符 protected :用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②与它在同一个包中的其它类;③在其它包中的该类的子类。使用修饰符 protected 的主要作用是允许其它包中它的子类来访问父类的特定属性。 4、私有保护访问控制符 private protected :用修饰符 private protected 修饰的成员变量可以被该类本身或该类的子类两种类访问和引用。 5、静态域修饰符 static :用 static 修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。任何一个类的对象访问它时取到的都是相同的数据;任何一个类的对象修改它时 , 也都是对同一个内存单元进行操作。 6、最终域修饰符 final :最终域修饰符 final 是用来定义符号常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。 7、易失 ( 共享 ) 域修饰符 volatile :易失 ( 共享 ) 域修饰符 volatile 是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过灶嫌程中,这个成员变量有可能被其它的程序影响或改变它的取值。因此,在使用中要注意这种成员变量取值的变化。通常 volatile 用来修饰接受外部输入的域。 8、暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符 transient 限定的暂时性变量,将指定 Java 虚拟机认定该暂时性变量不属于永久状态,以实现不同对象核慎的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。 4、方法的控制修饰符也分为:可访问控制符和非访问控制符两类。 可访问控制符有 4 种:公共访问控制符: public ;私有访问控制符: private ;保护访问控制符: protected ;私有保护访问控制符: private protected 非访问控制符有 5 种:抽象方法控制符: abstract ;静态方法控制符: static ;最终方法控制符: final ;本地方法控制符: native ;同步方法控制符: synchronized 1、抽象方法控制符 abstract :用修饰符 abstract 修饰的方法称为抽象方法。抽象方法是一种仅有方法头,没有方法体和操作实现的一种方法。 2、静态方法控制符 static :用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法;而不使用 static 修饰、限定的方法是属于某个具体类对象的方法。 由于 static 方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static 的域。 3、最终方法控制符 final :用修饰符 final 修饰的方法称为最终方法。最终方法是功能和内部语句不能更改的方法,即最终方法不能重载。这样,就固定了这个方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类 ) 中的方法,都被认为是最终方法。 4、本地方法控制符 native :用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰; 5、同步方法控制符 synchronized :该修饰符主要用于多线程共存的程序中的协调和同步。

‘肆’ Java中的四种访问控制域是什么

private,public,protected,默认不写(firendly)

1、Class类的访问权限:
public:可以供所有的类访问。
默认:默认可以称为friendly但是,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++。默认的访问权限是包级访问权限。
即如果写了一个类没有写访问权限修饰符,那么就是默认的访问权限,同一个包下的类都可以访问到,即使可以实例化该类
(当然如果这个类不具有实例化的能力除外,比如该类没有提供public的构造函数)。

说明:
1、每个编译单元(类文件)都仅能有一个public class
2、public class的名称(包含大小写)必须和其类文件同名。
3、一个类文件(*.java)中可以不存在public class。
这种形式的存在的场景:如果我们在某个包内撰写一个class,仅仅是为了配合同包内的其他类工作,而且
我们不想再为了撰写说明文档给客户(不一定是现实意义的客户,可能是调用这个类的类)看而伤脑筋,而且有可能过一段时间之后
有可能会彻底改变原有的做法,并完全舍弃旧版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的static的成员(属性和方法)可以办到。

2、类成员变量的访问权限:
public:紧接public的属性任何类都可以访问到。可以直接使用ClassName.propertyName。但是从类的封装性上来考虑将一个类的属性定义成public一般很少使用,
在定义静态常量的时候通畅会这样定义。如:public static final int PAGE_SIZE=10;
private:只有类本身内部的方法可以访问类的private属性,当然内部类也可以访问其外部类的private成员的。(属性和方法)
默认(friendly):包级可见,同一个包内的类可以访问到这个属性,可以直接使用className.propertyName来访问,但是从类的封装性特性来说很少这样使用类的属性的。
protected:关键字所处理的是所谓“继承”的观念。对于同一包的其他类,protected=默认,对于不同包的类,如果存在继承关系,而baseClass存在protected属性,则可以被其自继承,而不同包的其他类
则不能访问类的protected属性。

3、类的成员方法的访问权限:
其从语法角度来讲,这些访问权限控制符作用于类的方法和作用于类的属性上的效果是一样的。
public:所有类可见。
pirvate:只有同一类内部的方法可见,在有就是内部类也可以访问到。
默认(friendly):包内可见。
protected:继承可见。

4、访问权限存在的理由
1、“让使用者无法碰触到他们不该碰触的东西。”这些东西仅供类的内部机制使用。将某些成员声明成private,对于使用者来说可以说是一种服务,
因为这样使用者可以知道哪些是他关注的哪些是不重要的,不需要关注,如此历来对于使用来说降低了对使用对象认识的难度。
2、(最终要的理由)让程序设计者可以更动class内部运作方式,而无须担心波及到客户端程序。

5、java的“访问权限修饰符”赋予classes开发者极具有价值的控制能力。身为classes开发者,如果你的任何改变可以完全不干扰你的使用者,
你便可以安心改变你的底层实现,因为客户端程序员无法访问class的这一部分。
通过今天学习访问权限的问题了解到,接口或者抽象等等策略所谓的“实现隐藏”其根本原因并不是说为了隐藏实现的代码和思路,而是降低使用者的使用难度,以及从维护角度来说可见范围的控制给程序维护带来了极大的安全性。

阅读全文

与java类域相关的资料

热点内容
干程序员可以干兼职吗 浏览:640
go中文pdf 浏览:530
电脑dns的服务器地址设置 浏览:530
编程出1000以内水仙花数 浏览:113
程序员多大转行 浏览:879
单片机灯 浏览:871
如何启动u8管理服务器 浏览:280
程序员消费多少 浏览:510
编译室半年总结怎么写范文 浏览:469
windowsapi编程入门教程 浏览:837
单片机51系列 浏览:58
python迭代器是什么 浏览:538
bat备份文件夹删除 浏览:928
推拉的文件夹 浏览:517
嵌入式linux前景 浏览:13
屏幕滚动命令 浏览:504
解压珠含毒素 浏览:770
美文诵读配乐用什么app 浏览:567
java代码设置字体 浏览:450
linuxsamba重启命令 浏览:825