目录  

  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. Cross Validation done wrong

    Cross Validation done wrong Cross validation is an essential tool in statistical learning 1 to estim ...

  2. 【Asp.Net WebFrom】分页

    Asp.Net WebForm 分页 一. 前言 Asp.Net WebForm 内置的DataPager让人十分蛋疼 本文使用的分页控件是第三方分页控件 AspNetPager,下载地址: 链接: ...

  3. Yarn的服务库和事件库使用方法

    事件类型定义: package org.apache.hadoop.event; public enum JobEventType { JOB_KILL, JOB_INIT, JOB_START } ...

  4. MEAN实践——LAMP的新时代替代方案(下)

    在本系列文章的第一部分旨在介绍一些应用程序的基础技术细节和如何进行数据建模,而这个部分文章将着手建立验证应用程序行为的测试,并会指出如何启动和运行应用程序. 首先,编写测试 首先定义一些小型配置库.文 ...

  5. 线性时间常数空间找到数组中数目超过n/5的所有元素

    问题描述: Design an algorithm that, given a list of n elements in an array, finds all the elements that ...

  6. 【leetcode】Contains Duplicate & Rectangle Area(easy)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  7. POJ 1317

    #include <iostream> #include <string> using namespace std; char p_code[] = {'_','a','b', ...

  8. POJ 3335 Rotating Scoreboard(半平面交求多边形核)

    题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...

  9. Django视频教程 - 基于Python的Web框架(全13集)

    Django是由Python驱动的开源模型-视图-控制器(MVC)风格的Web应用程序框架,使用Django可以在即可分钟内快速开发一个高品质易维护数据库驱动的应用程序.下面是一大坨关于Django应 ...

  10. spring_150804_controller

    实体类: package com.spring.model; public class DogPet { private int id; private String name; private in ...