#千峰#java08初始化和静态

一、构造方法

1、定义:

。用于初始化对象

。我们在通过new关键字创建对象的时候,必须调用构造方法

2、特点:

。方法名和类名相同(大小写也要与类名相同)

。没有返回值类型。注意,连void都没有

。没有具体的返回值return

。构造方法可以是有参的,也可以是无参的

3、演示


public class Student{ //构造方法 public Student(){ System.out.println("构造方法"); } }

4、注意事项:

。在创建对象时,构造方法会在对象创建之后自动被调用

。如果没有写构造方法,那么编译器会自动加一个空参的构造方法

。如果已经写了有参的构造方法,编译器就不会再加上空参的构造方法

。这时,如果还想使用空参的构造,那么,就需要手动补上空参构造

。构造方法必须通过new关键字来调用,不可以使用对象名来调用

。构造方法也是成员方法,只是比较特殊而已,所有成员方法的属性构

造方法也拥有

。创建对象的时候,只能调用一个构造方法,但构造方法内部可以相互

调用

。本类中的成员方法无法直接调用构造方法

二、构造方法的重载

1、定义:

。和成员方法的重载一样,方法名相同,参数列表不同。

。需要注意的是,只要是构造方法,方法名一定是相同的,也就是说构

造方法的重载只是参数列表不同

2、构造方法相互调用

。构造方法可以重载,我们可能会写多个构造方法以应对不同的赋值

动作,已经写过的构造方法可以直接调用

。使用this(),表示调用本类的构造方法

。this()必须写在第一行

3、演示

public class Student { 
private String name ; private int age; //空参构造
 public Student(){ 
} //有参的构造方法
 public Student(int age){
 if(age>0&&age<150) this.age = age; } 
public Student(String name,int age){ //调用构造方法 this(age); 
this.name = name; } }

三、类成员之间的相互调用

1、定义;

。成员变量一般来说都是为了成员方法服务的

。成员方法可以根据成员属性的不同做出不同的应对

2、演示

public class RectangLe{
 private int high ;
 private int with; 
public Rectangle(int high ,int with){
 this.high = high; 
this.with = with; 
} //获取面积 public int getArea(){
 return high*with; 
} //获取长方形的周长 public int getLength(){
 return (high + with)*2; 
} public int getHigh(){ 
return high; 
} public int setHigh(int high){ 
this.high = high; 
} public int getWith(){ 
return with;
 } public int setWith(int with){
 this.with = with; 
} 
}

四、代码块:

1、定义:

。代码块就是定义一个无名称的代码块,用{}括起来

2、分类:

。局部代码块:方法中

。构造代码块: 类中方法外

。静态代码块:类中方法外

。同步代码块:作用域多线程中

3、应用:

。局部代码块:

。限定局部变量的生命周期,及早释放,提高内存利用率

。在方法中创建一个域,限制变量的作用范围

。构造代码块:

。创建对象时候优先于构造方法执行,多个构造方法中相同

的代码存放到构造代码块中,节省代码量

。静态代码;

。给构造代码块加上static关键字就变成了静态代码块,用

于类的初始化,在类加载的时候就执行,并且只在类加载的

时候执行一次,一般用于加载驱动。

public class Demo { //构造代码块 { System.out.println("构造代码块执行了"); } //静态代码块 static{ System.out.println("静态代码块执行了"); } public void method(){ //局部代码块 { System.out.println("局部代码块执行了"); } } }

4、对象初始化顺序问题

。成员变量==》构造代码块==》构造方法

。成员变量和构造代码谁在上面先执行谁(一般是,成员变量在上)

五、静态(static)

[图片上传失败...(image-5da7d4-1584889379646)]

。静态:存储在静态方法区,跟对象没有关系,创建的对象中是不存在

静态的内容的

。好处:不用创建对象也可以直接调用,节省时间,每个对象中不用去

记录这个方法,节省对象的存储空间。

1、定义:

。用于修饰类的成员,表示静态

。一旦被修饰,类的成员将不再属于这个类创建的对象

2、特点:

。随着类的加载而载

。优先于对象存在

。被类的所有对象共享

。通过类名调用

·其实他本身也可以通过对象名调用

·推荐使用类名调用

。优先于非静态成员

。类的所有静态成员都存储于静态方法区

3、初始化顺序:

。静态成员变量==>静态代码块==>成员变量==>构造代码块==>构造方

。静态成员变量和静态代码块(构造代码块)谁写在前面谁先执行

4、静态方法的缺点:

。静态方法区小,存储过多的内容,容易造成内存溢出,还会降低

查询效率

六、类加载:

1、。从硬盘将.class文件读到内存中,形成java的类,这个过程称之为

类加载。

2、分两步(其实是13步):

。加载类

。类初始化

七、静态的使用:

。非静态可以直接调用静态,因为:非静态可以执行时,静态一定存在

。静态无法调用非静态,因为:因为不确定非静态是否真的存在,就是

存在,对象有可以有很多,也不知道用哪个对象的

。静态只能调用静态,非静态可以调用静态

1、定义:

。公用的变量就可以写成静态的、频繁被使用的方法要写成静态的

。当一个雷的成员被频繁的使用的时候,就可以写成静态

。当一个属性或方法被所有的对象共享的时候,可以写成静态的

2、使用格式:

。类名.成员变量名

。类名.方法名()

3、演示

public class Demo{
 //静态成员变量 
public static String name = "小红";
 //静态的成员方法
 public static void method(){ 
System.out.println("静态方法");
 }
 }
 public static void main(String[] args){
 //调用静态成员变量
 System.out.pringtln(Demo.name); //调用静态的成员方法 Demo.method(); 
}

4、注意事项:

。静态的成员在内存中只有一份

。所有的操作指向的都是同一个静态成员

。可以使用对象名调用,但是不推荐

。静态可以极大的提升运行的效率

。静态随着类的存在而存在,随着类的消亡而消亡,jvm不关闭

,静态就一直存在,太多的话,容易造成内存溢出。

。频繁被使用的成员要写成静态的

八、静态和非静态

1、this关键字的问题

。静态中方法无法使用this关键字,因为静态方法调用的时候,不需要

对象

。非静态方法中可以使用this关键字,因为非静态方法在调用的时候必

须有对象

2、访问成员变量

。静态方法只能访问静态的成员变量,如果要使用非静态的成员变量

必须先创建对象

。非静态的方法可以直接访问静态的成员变量,也可以直接访问非静态

的成员变量

3、访问成员方法

。静态方法只能访问静态方法,如果想使用就必须要创建对象

。非静态方法可以直接访问静态方法,也可以直接访问非静态方法

4、简单记

。静态只能访问静态(直接调用)

public class Demo{ static String name = "李四"; int age = 19 ; public static void method(){ //静态方法可以直接访问静态成员变量 System.out.println(name); //这里会报错 //System.out.println(age); //静态要访问非静态的成员变量必须要创建对象 Demo d = new Demo(); System,.out.println(d.age); //静态方法可以直接访问静态方法 method3(); //静态方法想要访问非静态方法必须要先创建对象 demo.method4(); } public void method2(){ //非静态可以直接访问静态成员变量 System.out.println(name); //非静态方法可以直接访问非静态的成员变量 System.out.println(age); //非静态方法可以直接访问静态成员方法 method3(); //非静态方法可以直接访问非静态方法 method4(); } //静态方法 public static void method3(){ } //非静态方法 public void method4(){} }

九、main方法详解

1、格式:

。 public static void main(String[] args){}

2、详解

。public 被jvm调用,访问权限足够大

。static 被jvm调用,不用创建对象,直接类名访问

。void 被jvm调用, 不需要给jvm返回值

。main 一个通用的名称,虽然不是关键字,但是被jvm识别

。String[] args 以前用于接受键盘录入的arguments

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容