java类与字段
① java里的“字段”是什么
在api文档中可见“字段摘要”,其中的“字段”可以理解为类中的成员变量或成员常量。
② JAVA中 类、对象、成员与字段的区别
类就是某一类事物的抽象描述
对象是 类的具体实例
成员是类中的 组成部分
字段和成员类似
比如:
家 //这就是一个类,在这个家中你也不知道具体有哪些事物
父亲 //这是一个类的成员,当类没有实例化时,你也不知道具体是谁
地址 //这是一个字段 当类没有实例化对象时,你也不知道其具体值是啥
小明家 //这就是一个对象,你知道这个家里有哪些人哪些物
小明的父亲 //当类被实例化成对象时,其成员也就确定下来了。
北京新村2号 //这个地址也就确定下来了
③ java "字段"啥意思
public final static InputStream in = nullInputStream();
nullInputStream是这样实现的:
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
他不是返回null,就是抛出异常,如何初始化in呢?
解答:
看了一下java.lang.System的源代码.
System类里有大量的native方法,是调用本地代码的,这些代码很可能是由虚拟机来调用的.
System类的开头有一段:
static {
registerNatives();
}
这段代码会在虚拟机启动的时候就执行,它在虚拟机里注册System需要使用的一些本地代码
比如:
private static native Properties initProperties(Properties props);
private static native void setOut0(PrintStream out);
在windows下的话,它就告诉虚拟机到哪个dll文件里去找相应的实现
>然而,我知道out是一个PrintStream的对象,但我查看了有关的原代码:public final static PrintStream out = nullPrintStream();
>public final static InputStream in = nullInputStream();
在nullInputStream()方法里有注释解释为什么会设置为空:
/**
* The following two methods exist because in, out, and err must be
* initialized to null. The compiler, however, cannot be permitted to
* inline access to them, since they are later set to more sensible values
* by initializeSystemClass().
*/
private static InputStream nullInputStream() throws NullPointerException {
if (currentTimeMillis() > 0)
return null;
throw new NullPointerException();
}
也就说in, out, and err 初始化为null,然后会在后来由initializeSystemClass()方法类初始化成有意义的值
/**
* Initialize the system class. Called after thread initialization.
*/
private static void initializeSystemClass() {
props = new Properties();
initProperties(props);
sun.misc.Version.init();
FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn)); !!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); !!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); !!!
// Enough of the world is now in place that we can risk
// initializing the logging configuration.
try {
java.util.logging.LogManager.getLogManager().readConfiguration();
} catch (Exception ex) {
// System.err.println("Can′t read logging configuration:");
// ex.printStackTrace();
}
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
// Subsystems that are invoked ring initialization can invoke
// sun.misc.VM.isBooted() in order to avoid doing things that should
// wait until the application class loader has been set up.
sun.misc.VM.booted();
}
in,out,err就是在以上方法以下三条语句里初始化的.
setIn0(new BufferedInputStream(fdIn)); !!!
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); !!!
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); !!!
看
private static native void setIn0(InputStream in);
~~~~~~~
这是个native函数,是前面registerNatives()的时候注册了的.这个函数应该是把实际连接到输入输出设备的句柄传给虚拟机并赋值给in,out,err
至于:
>InputStream是个抽象的类,怎么能使用char=(char)System.in.read()读入一个字符
我想你还没有明白什么是面向对象.
看看下面代码,我用OutputStream(也是抽象类,跟InputStream对应的输出类)以方便演示:
import java.io.IOException;
import java.io.OutputStream;
public class HelloWorld {
public OutputStream out=null;
public void setOutputStream(OutputStream out){
this.out=out;
}
public static void main(String[] args) throws IOException{
HelloWorld h=new HelloWorld();
PrintStream myOut=System.out;//System.out是一个PrintStream
h.setOutputStream(myOut);
h.out.write("hello,world".getBytes());//一般没人这么写的
}
}
以上代码执行后会输出hello,world
h.out是OutputStream,也是个抽象类,为什么能write(o)呢?
因为PrintStream是OutputStream的子类,所以能被"当作"OutputStream传给h.setOutputStream(myOut);
h.out.write执行的时候实际上是调用这个传进来的PrintStream实例的write方法
同样System.in和out肯定也是在initializeSystemClass()的时候被赋予了一个实际的可用的子类
要能体会到面向对象的好处,就要逐渐适应"对接口编程"的思想,相同接口的对象可以根据需要方便的替换.
比如,我刚才传了一个PrintStream,因此HelloWorld输出到了屏幕上. 我如果传给OutputStream的另一个子类FileOutputStream,就会输出到文件里
>还有为什么不是说字符流:writer和reader一般用于UniCode的读写吗?为什么键盘的输入用reader类呢?
不知道你在哪里看到说writer和reader一般用于UniCode的读写
④ Java的属性与字段有什么区别
1、Java中的属性和字棚姿汪段有什么区别?
答:Java中的属性,通常可以理解为get和set方法。而字册如段,通常叫做“类成员”。
这两个概念是完全不同的。
属性只局限于类中方法的声明,并不与类中其他成员相关。例如:
void setA(String s){}
String getA(){}
当一个类中拥有这样一对方法时,我们可以说,这个类中拥有一个可读写的a属性(注意是小写a)。如果去掉了set的方法,则是可读属性,反之亦然。
类成员(字段),通常是在类中定义的类成员变量,例如:
public class A{
private String s = "123";
}
我们可以说A类中有一个成员变量叫链仔做s。
⑤ JAVA中 类、对象、成员与字段的区别
类里面
属性,字段,方法
类声明前必须加访问修饰符。而且一个类里面只能有一个public class类
举个例子
万物都是对象。比余或碰如人,汽车,船 等等
类里面团厅得属性叫做成员
举个例子
//类
public class Car() //方法体
{
//可以有方法和属性
先定义属性即成员
String name; //车名
int size; //大小
String col; //颜色
public static void play( String name)
{
System.out.print(da)
public static void main(String [] args)
{
Car c=new Car();//c 就是一个对象
car.play();
}
}
}//大括号就是方法体可以在里面定义方法
刚竖谈写得有不懂可以问我
⑥ Java自定义注解注解实现实体类与数据库表字段的映射
这个 按照我的理解
首先自定义注解要有自己的编译解释方法的
在这个便已解释方法中估计需要连接数据库(当然最激贺薯基本的jdbc什么的)
当然连接数据库什么的涉及到配置文件
通过jdbc获取到数据库信息 把注解中的参数与数据库中的信息关联(简单的就可以存成List<Map等方式)由于注解的参数一般是类名。你可以 用反射的方式或其他方式(比如字节码什么的)来处理获拍锋取类的属性
然后 我感觉关联完了 就没啥然后了 感觉主要是在注解的编译解释方法中做明者写东西 当然 提高效率也可以用数据库连接池什么的
⑦ java中类的字段为什么都要设为私有的
字段设为私有,是满足面向对象中封装性,
一个类不建议允许直接获取到另一个类的字段,
同时也不建议直接把自身字段暴露给另一个类,
本质上其实是为了隐藏具体实现,
同时,用get或者set方法来获取或者设置的话,可以在该方法中添加一些简单的验证逻辑,
比方说有个学生类,其中有个年龄字段,如果直接做成public的话,那么这个年龄字段可以设置为负值,
但是你做成了set方法的时候,你调用set设置年龄,那么你可以在set方法中去对为负数的年龄进行验证处理
Java面向对象类和类之间的关系教程:
⑧ java中string类型字段-1等于什么
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
java
打开APP
章鱼四剑客
关注
Java—String类—1 原创
2019-01-06 18:59:19
1点赞
章鱼四剑客
码龄5年
关注
Java—String类—1
实例化方法
直接赋值/构造法
字符串相等比较
两种方法:
”==“:进行的数值比较,比较的是两个字符串对象的内存地址数毁侍值
“equals”:可以进行字符串内容比较
字符串常量是String的匿名对象
在java中本身没有提供字符串常量的概念,所有使用“”定义的内容本质上来讲都是String的匿名对象。
验证
Tips:在用equals方法对指定字符串和用户输入字符串进行比较时,指定字符串方到前面,因为用户可能没有输入
发生NullPointerCase空指针异常
实例化区别
1.采用直接赋值
是这个样子呢?
以上这种情况说明,三块对象引用指向一块空间;
其实,java采用的是共享机制
在JVM底层实际上回自动维护一个对象池,如果现在采用直接赋值对对象进行实例化,那么该实例化对象(字符串内容)会自动保存到该对象池中。如果下次再继续使用直接赋值的模式声明String类对象,此时对象池中如果有指定内容,将直接进行引用;如若没有,则开辟新字符串对象而后将其保存在对象池中下次使用。
2.采用构造法
构造法:
1.会产生两块空间,其中一块,变成垃圾空间;
2.不会自动入池,但是可以手动入池intern()方法;
在这里插入图片描述
比较:
1.直接赋值,产生一块堆空间,并且字符串对象可以自动保存在对象池中以供瞎使用;
2.构昌者造方法:会开辟两块堆空间,其中一块变成垃圾空间,不会自动保存到对象池中,可耐余薯以用intern()自动赋值
字符串不可变更
在这里插入图片描述
首先我们可以看出,字符串的内容不能改变,最后输出的不是初始值,是因为改变的是对象的引用指向;并且,每进行一次加操作,就会产生两块垃圾空间,所以java中尽量不要使用“+”操作。但是其实java在进行+操作时,会自动将Strin
⑨ java实体类如何加入虚拟字段
java实体类加入虚拟字段的步骤如下:
1、一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。