目录  

  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深入学习之--初始化的更多相关文章

  1. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  2. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  3. struts2源代码学习之初始化(一)

    看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须 ...

  4. Android(java)学习笔记160:Framework运行环境之 Android进程产生过程

    1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...

  5. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. 转:深入Java集合学习系列:HashSet的实现原理

    0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

  8. Java编程学习知识点分享 入门必看

    Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...

  9. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

随机推荐

  1. HDOJ 2152 Fruit(母函数)

    Fruit Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. 谈谈arm下的函数栈

    引言 这篇文章简要说说函数是怎么传入参数的,我们都知道,当一个函数调用使用少量参数(ARM上是少于等于4个)时,参数是通过寄存器进行传值(ARM上是通过r0,r1,r2,r3),而当参数多于4个时,会 ...

  3. LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载

    LNMP笔记:安装 Xcache 缓存扩展,降低服务器负载 2014/11/27 教程笔记 4,743 14     WordPress 精品主机推荐:恒创主机 | 阿里云(本站目前所用云主机) 倡萌 ...

  4. HDU4010 Query on The Trees(LCT)

    人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...

  5. codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)

    题目 这要学习的是如何枚举区间,vector的基本使用(存入,取出,排序等),这题的思路来自: http://www.tuicool.com/articles/fAveE3 //vector 可以用s ...

  6. HDU 2852 KiKi's K-Number(树状数组+二分搜索)

    题意:给出三种操作 0 e:将e放入容器中 1 e:将e从容器中删除,若不存在,则输出No Elment! 2 a k:搜索容器中比a大的第k个数,若不存在,则输出Not Find! 思路:树状数组+ ...

  7. [C++]内存字节对齐

    当我们写一个class类,然后sizeof(),然后发现这个值往往比你想象的大,这是为什么呢?这里就要讲到内存对齐的问题. 先来看一下内存对齐的几条原则: 1.对于class(struct/union ...

  8. grep是模糊匹配

    1. 我:我用的ps -nat|grep -i "80"|wc -l命令 我:解释详细点,,龙哥,对于我这种菜鸟:也是模糊匹配 :你用 grep "80" 会匹 ...

  9. Java-马士兵设计模式学习笔记-观察者模式-OOD 线程 改进

    1.概述 由于上一个文章<Java OOD 线程>中的线程是父类主动监听childe,比较耗资源,现改进为childe类醒来后主动联系父类 2.代码 Test.java class Chi ...

  10. x11vnc

    http://cisight.com/how-to-setup-vnc-server-remote-desktop-in-ubuntu-11-10-oneiric/ Install VNC serve ...