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讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
随机推荐
- 利用WiFi钓鱼法追邻居漂亮妹纸
假设,你的邻居是一个妹纸.漂亮单身,你,技术狗,家穷人丑,集体户口.像借酱油这种老套搭讪方式的成功率对你来说实在很低. 你要做的是了解她,然后接近她.通过搜集更多的情报,为创造机会提供帮助. 初级情报 ...
- PowerDesigner(二)-项目和框架矩阵(转)
项目和框架矩阵 项目是PowerDesigner 15的新概念,通过项目系统分析/设计人员可以对模型以及各类文档进行分组.项目也可以包含框架矩阵,以表格的形式体现各个模型之间的关系. 项目和框架矩阵解 ...
- [HTML/CSS]display:none和visibility:hidden的区别
写在前面 在群里有朋友问这样一个问题,display:none的标签,影响了布局.这就引出了本篇这样的问题,印象中display:none的块元素是不占位置的. 一个例子 <!DOCTYPE h ...
- 用HAProxy和KeepAlived构建高可用的反向代理
用HAProxy和KeepAlived构建高可用的反向代理 用HAProxy和KeepAlived构建高可用的反向代理 前言对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求 ...
- CSS 外边距(margin)重叠及防止方法
边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大 ...
- Ruby中的语句中断和返回
李哲 - APRIL 28, 2015 return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一 ...
- hdu 2639 Bone Collector II (01背包,求第k优解)
这题和典型的01背包求最优解不同,是要求第k优解,所以,最直观的想法就是在01背包的基础上再增加一维表示第k大时的价值.具体思路见下面的参考链接,说的很详细 参考连接:http://laiba2004 ...
- POJ 2140
#include<iostream> #include<stdio.h> using namespace std; int main() { int num; int i; i ...
- Java IO(二)
字节流 字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream B ...
- ABP集合帖
http://www.cnblogs.com/kebinet/p/5341663.html http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent ...