java初始化机制(一)

1、初始化一般是通过构造器进行初始化的,如果类中没有写构造器则编译器自动为其提供默认构造器。如果程序中已经写了构造器,则编译器不会提供默认构造器。

Banana b=new Banana();

2、构造器的重载

如果想要以多种方式创建一个对象该怎么办?

方法名相同,参数个数(或类型)不同的构造器同时存在,就是构造器重载。构造器重载是必须的,但是也可以应用到其他方法中。

//构造器重载

<span style="color:#000000;">public Constructor02(){}
 public Constructor02(int i){}
 public Constructor02(int i,int j){}
 public Constructor02(float i){}</span>

3、构造方法区分

每个重载方法都有一个唯一的参数类型列表,用来区分具体调用哪个方法。

但是基本类型能够从一个较小的类型自动提升至一个较大的类型。如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int.

提升顺序为:byte<short<int<long<float<double:如果是说实际类型是byte类型,它首先向上提升为short,如果没有short类型,则提升为int,如果没有int则提升为long......

char直接提升为int及以上的类型。

<span style="color:#000000;">package jin.feng1;
class Constructor02{
 public Constructor02(){}
 public Constructor02(int i){}
 public Constructor02(int i,int j){}
 public Constructor02(float i){}
 //void print(int i){ System.out.println("int");}
 void print(float i){ System.out.println("float");}
 //void print(char i){ System.out.println("char");}
 void print(short i){ System.out.println("short");}
 void print(double i){ System.out.println("double");}
}
public class Constructor01
{
 public static void main(String[] args)
 {
 Constructor02 constructor02=new Constructor02();
 char c='a';
 int a=1;
 float b=9;
 double d=9;
 constructor02.print(c);
 }
}
//output
float
</span>

4、为什么返回值区分不了重载方法

例如方法定义如下:

void f(){}
int f(){return 1;}
调用的时候f(),则编译器不知道该调用哪个方法。所以用返回值区分是行不通的。

5、this关键字

this表示当前对象的引用

如果你希望在方法内部获得对当前对象的引用,this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。

package jin.feng1;
class Banana{
 void print(){}
 void peel(int i){
  print();//直接调用,编译器自动转变为this.print()
 }
}
public class This01
{
 public static void main(String[] args)
 {
 Banana a=new Banana();
 Banana b=new Banana();
 a.peel(1);//编译自动添加this 转变为Banana.peel(a,1)
 b.peel(2);
 }
}

一般编译器都会帮你自动添加,所以只有当需要明确指出对当前对象的引用时,才需要使用this关键字。

Banana increment(){

i++;

return this; //

}

将当前对象传递给其他方法:

return Peel.peel(this);

如果想要在构造器中调用构造器,避免重复

<span style="color:#000000;BACKGROUND-COLOR: #ffffff">public Constructor02(){}
 public Constructor02(int i){this();} //产生符合此参数列表的某个构造器的明确调用
 public Constructor02(int i,int j){this(i);}
 public Constructor02(float i){}</span>

6、static关键字

一个类中static方法只能访问static类型,还可以通过创建对象进行访问其他非static方法(一般是main方法中,其他方法中没什么实际意义)。

但是非static方法既能够访问static变量又能够访问static方法。

<span style="color:#000000;">class Banana{
 int j;
 static int i;
 static void count(){
  Banana b9=new Banana();
  b9.i=9;
  b9.j=8; //通过创建对象访问其非static类型的
  b9.print(); //通过创建对象访问其非static类型的
  //j++;  不可直接访问
  //print();
  i++;//直接访问static变量
 }
 void print(){ //非static方法直接访问static成员。
  System.out.println("i:"+i);
  count();
 }
 Banana increment(){
  i++;
  return this;
 }
}
</span>

注意:static成员每个类仅仅只有一份

static类型的成员变量一般用来计数,因为每个类仅仅只有一份,可以对创建对象进行计数啊

但是static类型的成员方法有什么用?


静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的 那在什么时候需要呢?
一般是为了方便调用才会声明为static方法:
例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
注意使用:
静态方法可以直接通过类名调用,任何的实例也都可以调用,

因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

因为实例成员与特定的对象关联!这个需要去理解,因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

时间: 2024-08-28 13:29:45

java初始化机制(一)的相关文章

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java反射机制剖析(三)—类类型Class

为了区别于我们常用的Class,因此给了个中文名类类型.目的就是为了知道此Class非彼Class.上一篇博客已经介绍了Class Loader,它的作用是根据提供的信息来加载类到内存中.我之前有提过这个类信息的提供者就是本篇博客要介绍的Class.提醒:一个类的Class对象和它的Instance是不一样的,切记,不然你会混乱的.开始了! 概念 Class类是所有类(注意是对象)的共有信息的抽象,比如该类实现的接口.对应的加载器.类名等等.一句话,类类型保存了每个类所对应的类型信息.每一个类都

理解Java ClassLoader机制(转载)

当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader                |       extension classloader                |       system classloader bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. 在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用 - D

Java反射机制专题

·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法 ·Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任何一个对象的成员变量和方法 生成动态代理 ·反射相关的主要API: java.lang.Class:代表一个类 java.lang.refle

探索Java反射机制

Java反射机制,可以说我们平常开发中用的很多,尽管作为开发人员,我们并没有什么感觉,那是因为框架的设计者,已经为我们封装好了,我们只需要用去调用一下就可以了.以前也用到过反射,包括自己也写过,也学到过,但是我感觉都比较浅,今天有时间,我觉得有必要去慢慢的深入了解一下. 我们把能够分析类能力的程序称为反射(reflective).反射机制功能及其强大,简单说几个反射的用途: 1.在运行中分析类的能力: 2.在运行中查看对象,例如编写一个通用的tostring方法: 3.实现通用的数组操作代码:

Java知识总结:Java反射机制(用实例理解)

概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. Java中的反射是一个强大的工具,他能够创建灵活的代码,这些 代码可以在运行时装配,无需在组件之间进行链接,发射允许在编写和执行时,使程序代码能够接入装载到 JVM 中的类的内部信息 .而不是源代码中选定的类协作的代码.这使发射

Java反射机制Class类的用法详解

本文转自http://blog.sina.com.cn/s/blog_6c9536b90100rqh4.html,感谢作者 java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识! java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息. 当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象

图解 & 深入浅出Java初始化与清理:构造器必知必会

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 在面向对象编程中,编程人员应该在意"资源".比如 ? 1 <font color="#000000">String hello = "hello": </font> 在代码中,我们很在意在内存中Stri

Java类加载机制的深入研究

类加载机制 类加载是Java程序运行的首要步骤,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,同时让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 类加载过程 Java程序运行的场所是内存. 当在命令行执行java HelloWorld的时候,JVM会将HelloWorld.class加载到内存中,形成一个class对象:HelloWorld.class,具体过程如下: 1.找到jre目录,找到jvm.dll文件,并且初始化JVM 2.产生一个