Java编程思想学习笔记——初始化与清理(二)
成员初始化
Java尽力保证:所有变量在使用前都能得到适当的初始化。
- 方法的局部变量:未初始化,编译错误。
void f(){
int i;
// System.out.println(i);//编译错误
}
- 类的数据成员(字段)是基本类型:保证都会有一个初始值。
public class InitialValues {
boolean bl;
char c;
byte bt;
short s;
int i;
long l;
float f;
double d;
InitialValues reference;
void printValues(){
System.out.printf(
"\nboolean:"+bl
+"\nchar:"+c
+"\nbyte:"+bt
+"\nshort:"+s
+"\nint:"+i
+"\nlong:"+l
+"\nfloat:"+f
+"\ndouble:"+d
+"\nreference:"+reference
);
}
public static void main(String[] args) {
new InitialValues().printValues();
}
}
结果输出:
boolean:false
char:
byte:0
int:0
long:0
float:0.0
double:0.0
reference:null
- 指定初始化
在定义类成员变量的地方为变量赋值
public class InitialValues {
boolean bl=true;
char c='a';
byte bt=22;
short s=0xff;
int i=1202;
long l=1;
float f=3.14f;
double d=3.14159;
}
同样的方式初始化非基本类型的对象
class Apple{}
public class InitialValues {
Apple apple = new Apple();
}
调用方法来初始值
int i1 = getIntValue();
int i2 = getDoubleValue(2);
private int getDoubleValue(int i) {
return i*2;
}
private int getIntValue() {
return 2;
}
构造器初始化
无法阻止自动初始化的进行,它将在构造器被调用之前发生。
public class ConstructorInitial {
int i ;
ConstructorInitial(){
System.out.println(i);
i=1;
System.out.println(i);
}
public static void main(String[] args) {
new ConstructorInitial();
}
}
结果:
0
1
初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。
静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。
静态初始化只有在必要的时候才会进行。
初始化顺序是:静态对象-->非静态对象。
对象创建的过程
假设有个名为Dog的类:
- 首次创建Dog对象(构造器可以看成静态方法)或首次访问Dog类的静态方法或静态域时,Java解释器必须查找类路径,以定位Dog.class文件。
- 然后载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只有在Class对象首次加载的时候进行一次。
- 当用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间。
- 这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(数字为0,布尔型,字符型类似),而引用被设置为null。
- 执行所有出现于字段定义处的初始化动作。
- 执行构造器。
显示的静态初始化
Java允许将多个静态初始化动作组织成一个特殊的"静态块"
class Cup{
Cup(int marker){
System.out.println("Cup("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
}
class Cups{
//静态成员变量
static Cup cup1;
static Cup cup2;
//显式的静态初始化
//静态块
static {
System.out.println("static initialization");
cup1 = new Cup(1);
cup2 = new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
}
public class Initialization {
public static void main(String[] args) {
Cups.cup1.f(100);
/**
*static initialization
Cup(1)
Cup(2)
f(100)
*/
}
// static Cups cups = new Cups();
/**
* static initialization
Cup(1)
Cup(2)
Cups()
*/
}
非静态实例初始化
实例初始化:用于初始化每一个对象的非静态变量。
class Cup{
Cup(int marker){
System.out.println("Cup("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
}
class Cups{
//静态成员变量
static Cup cup1;
static Cup cup2;
Cup cup3,cup4;
//显式的静态初始化
//静态块
static {
System.out.println("static initialization");
cup1 = new Cup(1);
cup2 = new Cup(2);
}
//非静态实例初始化
{
System.out.println("non-static initialization");
cup3 = new Cup(3);
cup4 = new Cup(4);
}
Cups(){
System.out.println("Cups()");
}
}
public class Initialization {
public static void main(String[] args) {
new Cups();
/**
*static initialization
Cup(1)
Cup(2)
non-static initialization
Cup(3)
Cup(4)
Cups()
*/
}
}
Java编程思想学习笔记——初始化与清理(二)的更多相关文章
- Java编程思想学习笔记——初始化与清理
初始化 构造器保证初始化 构造器采用与类相同的名称. 默认构造器(default constructor):不接受任何参数的构造器,也叫无参构造器. 构造器也能带有形式参数,就能在初始化对象时提供实际 ...
- Java编程思想学习(三) 初始化与清理
1. 每个重载的方法都必须有独一无二的参数类型列表.(参数顺序的不同也足以区分两个方法,但不建议这样做,会使代码难以维护.) 2. 方法重载时,如果可以重载的方法间只是参数类型不同,传入的数据类型(实 ...
- 《 Java 编程思想》CH05 初始化与清理
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- Java编程思想 学习笔记11
十一.持有对象 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...
- Java编程思想 学习笔记1
一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...
- Java编程思想学习笔记——类型信息
前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...
- Java编程思想学习笔记——一切都是对象
前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...
随机推荐
- [转]oracle制定定时任务(dbms_jobs)
原文地址:http://www.cnblogs.com/siashan/p/4183868.html 本节摘要:本节介绍使用oracle自带的job来实现oracle定制定时执行任务. 1.引言 ...
- android手机安全性測试手段
android手机安全性測试手段 罗列一下自己经常使用的android手机安全性測试攻击手段: 1. fiddler和tcpdump+wireshark抓包分析,模拟改动http请求參数,检验漏洞 2 ...
- Go Revel - Validation(验证)
Revel提供了内建函数用于验证参数.它提供了: 一个`Validation`上下文集合来管理验证错误信息(键与消息内容) 辅助函数用于检查数据并将错误信息放入上下文 一个模板函数用于从`Valida ...
- Python-OpenCV快速教程
一.Mat生成图片 面的简单代码就可以生成两种表示方式下,图6-1中矩阵的对应的图像,生成图像后,放大看就能体会到区别: import numpy as np import cv2 import ma ...
- Java编程的逻辑 (63) - 实用序列化: JSON/XML/MessagePack
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- linux 获取网卡信息
sar -n DEV 2 10:41:37 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s10:41:39 AM eth ...
- substance新版及问题
新版地址:https://github.com/Insubstantial,目前是7.3版 http://stackoverflow.com/questions/3657538/substance-u ...
- charles系列破解激活办法(最高charles4.2.5都可以激活,亲测可用)
Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 抓包工具Charles的使用心得 https://www.jians ...
- linux文件经 windows系统 之后出现 权限缺失 的解决方法
把Linux下的文件拷贝到windows,再拷贝到Linux时,文件的权限丢失. 解决办法: 把文件压缩后,将压缩文件拷贝到windows系统上,再拷贝压缩文件到linux服务器,在目标linux服务 ...
- 关于Unity中的道具拾取(专题六)
原理就是把道具做成触发器,触发器就是当我们有碰撞发生的时候,只会检测碰撞,而不会有任何改变物理运动状态的过程. 触发器非常适合道具拾取,因为它不会改变原本运动物体的任何物理属性,但是依然会检测碰撞,响 ...