Java深入学习之--初始化
目录
1、方法重载
2、默认构造器
3、this关键字
4、static关键字
5、初始化
1、方法重载
java中方法重载的意思是在同一个类中可以存在方法名相同的方法,而方法的参数类型不同,即使两个方法的参数列表完全相同但只要顺序不同也可以,方法的重载适应于构造器,与方法的返回值类型无关。而java就是根据参数列表来区分具体调用哪一个方法。
public class Tree {
int height;
//构造器的重载
Tree(){
System.out.println("hello");
} Tree(int inithHight){
height = inithHight;
System.out.println("hello " + height);
} //普通方法的重载
void info(String s, int i){
System.out.println("method 1");
} void info(int i, String s){
System.out.println("method 2");
} public static void main(String[] args) {
new Tree().info(1, "123");
new Tree().info("123", 1);
new Tree(4).info(1, "1234");
}
}
public class Test2 {
void f1(double d){
System.out.println("f1(double)");
} void f2(int i){
System.out.println("f2(int)");
}
public static void main(String[] args) {
//输出f2(int)
new Test2().f1(1);
//报错找不到该方法
//new Test2().f2(1.0);
}
}
2、默认构造器
当我们定义的类中没有定义任何构造器时,编译器会提供给我们一个默认的无参构造器,但是只要我们,注意前提,当我们没有定义任何构造器时。 所以当我们定义了自己的构造器时而其中又没有无参构造器,再去new这个对象(new Dog() )就会报错,找不到构造器。
3、this关键字
this代表类的当前对象,就是指向当前对象的引用,当我们在方法内部调用同一个方法是,可以不必使用this,其实这就是我们平常习惯性的写法,编译器会自动帮我们添加,试想要是我们都加上this不就让代码的可读性降低了吗?
this用得最多的地方就是在构造器中,像下面这样的代码你肯定经常看到
因为为了代码的可读性,通常我们对标识符命有意义的词,所以当成员变量名和方法的局部变量名相同时,为了区分就在成员变量前加上this来与局部变量区分。
class Test3(){
int age;
Test3(int age){
this.age = age;
}
}
用this调用构造器,因为用this调用的构造器只能放在构造器第一行,所以一个构造器内只能有一个用this调用的构造器。讲得有点不清楚,构造器内调用其他构造器只能用this,这样应该清楚点了,神马还有其他办法调吗?请告诉我!像方法内调用同一个类中的其他方法一样调用吗?不行额,编译器会把这种写法当成调用普通方法。
public class Test2 {
int age;
String s; Test2(int age){
this.age = age;
} Test2(int age, String s){
//只能放在第一行
this(22);
this.s = s;
}
}
4、static关键字
static可以用来修饰成员变量、方法,修饰的变量特点就是所有该类的对象共享该变量,而用来修饰方法其实就是表示没有this的方法,别人可是在加载类的class文件时就执行了的,那时候可还没有对象哦,而且只在首次加载Class对象时执行一次。具体对象的创建过程在第5点讲。在static方法内部不能直接调用非静态方法,因为非静态方法必须由对象来调用啊,你肯定现在有对象没有?当然不能确定。反过来非静态方法可以调用静态方法哦。当在没有创建任何对象的前提下,静态方法仅能通过类本身来调用,写法是类名.方法名,看见没,别人调用方式都透露了这么多信息,这可是static方法的常见用途,你去看看工具类,我要用你的方法,还要每次创建对象,多麻烦。还有用在单例中,当我只想提供一个对象时,我会私有化构造器,用一个私有的常量来接受对象,这就可以保证只有一个对象了,当然这只是简单的说说,那别人怎么创建这个类的对象呢,那我给你提供个公共的static方法你不就可以通过类名调这个方法就ok了嘛,对象到手。
5、初始化
在说构造器初始化前先说说成员(也就是类的字段)的初始化,为保证变量在使用前都得到了恰当的初始化java编译器会对我们未赋值的变量给提供默认值,注意方法内的局部变量你不赋值可是会报错的,别人才不会管你那么多。
在有构造器初始化的同事有其他初始化方式,比如说静态代码块初始化,非静态代码块初始化,这些初始化是可以都会执行的。而且会在构造器调用之前发生。
那么就再来讲讲初始化的顺序,先看下面这个例子吧!注意:静态代码块和只有一句的静态实例初始化动作没区别,你要找区别就是把他们弄到了一起然后加了个括号就成了静态代码块了,非静态代码块同理。
class M1{
M1(int i){
System.out.println("M1(" + i + ")");
}
} class M2{
static{
System.out.println("static 1");
}
//new M1(1);
M1 m1 = new M1(1);
static{
System.out.println("static 2");
} M2(){
System.out.println("M2()");
m3 = new M1(33);
} M1 m2 = new M1(2);
void f(){
System.out.println("f()");
}
M1 m3 = new M1(3);
} public class Test2 {
public static void main(String[] args) {
M2 m = new M2();
m.f();
System.out.println("--------分隔线-------");
M2 m2 = new M2();
} }
/*
static 1
static 2
M1(1)
M1(2)
M1(3)
M2()
M1(33)
f()
--------分隔线-------
M1(1)
M1(2)
M1(3)
M2()
M1(33)
*/
由运行结果可以观察到重复创建对象静态代码块只执行了一次,而且是在创建对象或者调用类的方法时才会执行一次,这个也是最先执行的,然后就是非静态实例的初始化了,这个每创建一次对象都会执行一次,然后就是构造器的执行了,其实可以简单的理解因为静态的成员是类公用的嘛,第一次初始化了不就保证了成员不是null嘛,后面就用不着了,但非静态实例初始化和构造器初始化都是每个对象单独的一份,当然每次用都要初始化咯。
总结一下对象的创建过程,假设有个Dog类:
1、当一次创建Dog类的对象或者调用Dog类的静态方法时,java编译器就会查看类路径,查找Dog.Class文件。
2、然后加载Dog.Class,有关静态初始化的过程就在这个时候执行,而且只执行一次,注意:所有的都会执行。
3、当用new Dog()创建对象的,就在堆上给该对象分配的存储空间。
4、然后会对该类的变量进行初始化,全部初始化成默认值,引用设为null。
5、非静态代码块的初始化操作,这时候会把相应的默认值替换掉。
6、执行构造器进行初始化,这不非静态实例、静态实例初始化的值又可能被替换掉嘛。
原文参考自Thingk in java,转载请注明原文出处:http://www.cnblogs.com/dengmj/p/4751424.html
Java深入学习之--初始化的更多相关文章
- Java Web学习系列——Maven Web项目中集成使用Spring
参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...
- Java web 学习之旅
java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...
- struts2源代码学习之初始化(一)
看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制
ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- 转:深入Java集合学习系列:HashSet的实现原理
0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
随机推荐
- iOS开发之runtime的运用-获取当前网络状态
之前写过runtime的一些东西,这次通过runtime获取一些苹果官方不想让你拿到的东西,比如,状态栏内部的控件属性.本文将通过runtime带你一步步拿到状态栏中显示网络状态的控件,然后通过监测该 ...
- Science:给青年科研工作者的忠告
- windows phone MVVM开发心得第一天
之前刚刚学了asp.net网站的三层架构,为其中的优点着迷,可惜寒假本来决定学下MVC的计划泡汤了,刚开学,学了下windows phone 的MVVM模式的开发,在此留下点心得和脚印,第一天只是学了 ...
- 手写PE文件(二)
[文章标题]: 纯手工编写的PE可执行程序 [文章作者]: Kinney [作者邮箱]: mohen_ng@sina.cn [下载地址]: 自己搜索下载 [使用工具]: C32 [操作平台]: win ...
- UML交互图(转载)
概述: 从名字交互作用很明显,图中是用来描述一些不同的模型中的不同元素之间的相互作用.所以,这种相互作用是动态行为的系统的一部分. 这种互动行为表示UML中的两个图,被称为序列图和协作图.这两个图的基 ...
- Linux内存分配----SLAB
动态内存管理 内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享.内存管理方法应该实现以下两个功能: 最小化管理内存所需的时间 最大化用于一般应用的可用内存(最小化管理开销) 内 ...
- 浅谈MySQL索引背后的数据结构及算法【转】
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- tomcat与IIS在多IP服务器下的支持
同一个服务器下,双IP(或更多IP),实现tomcat与IIS公用80端口. 操作其实也很简单的,首先禁用iis的套接字池,iis绑定一个ip,然后tomcat在绑定另一个ip,最后重启下服务器即可. ...
- 理解 Memory barrier
理解 Memory barrier(内存屏障) 发布于 2014 年 04 月 21 日2014 年 05 月 15 日 作者 name5566 参考文献列表:http://en.wikipedia. ...
- HDU 3255 Farming (线段树+扫面线,求体积并)
题意:在一块地上种蔬菜,每种蔬菜有个价值.对于同一块地蔬菜价值高的一定是最后存活,求最后的蔬菜总值. 思路:将蔬菜的价值看做高度的话,题目就转化成求体积并,这样就容易了. 与HDU 3642 Get ...