黑马程序员_面向对象2

来源:互联网 发布:交易平台网站源码 编辑:程序博客网 时间:2024/04/27 22:24

------- android培训java培训、期待与您交流! ---------- 

 

static(静态)关键字

a).Static用法:是一个修饰符,用于修饰成员(成员变量和成员函数);当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员;

b).Static特点

1.随着类的加载而加载,也就是说静态会随着类的消失而消失,说明他的生 命周期最长。

2.优先于对象存在。在这里需要明确一点就是:静态是先存在的,对象是后 存在的。

3.被静态修饰的成员,可以直接被类名所调用,也就是类名.静态成员。

4.被所有的数据共享。

c).实例变量和类变量的区别

Stringname//成员变量/实例变量;

Staticstring country=”cn”//静态变量/类变量;

1.存放的位置

  类变量随着类的加载而存在于方法区中(共享区/数据区);

     实例变量随着对象的建立而存在于堆内存中。

2.生命周期

     类变量的生命周期最长,随着类的消失而消失;

实例变量的生命周期随着对象的消失而消失。

d).静态使用的注意事项

1.静态方法只能访问静态成员。

非静态的方法即可以访问静态也可以访问非静态。

2.静态方法中不可以定义thissuper关键字

因为静态优先于对象存在,所以静态访问中不可以出现thissuper

e).静态的优点与缺点

优点:1.对对象的共享数据进行单独空间的存储,节省空间,没有必要每一 个对象中都存储一份。

2.可以直接被类名所调用。

缺点:1.生命周期过长2.访问有局限性(静态虽好,只能访问静态)。

f).什么时候使用静态?

因为静态修饰的内容有成员变量和成员函数,所以要从两个方面来说。

1.什么时候定义静态变量(类变量)呢?

当数据出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义    成非静态存在于堆内存中。

2.什么时候定义静态函数呢?

当功能内部没有访问到非静态数据(对象的特有数据),那么该功能就可以  定义成静态的。

g).关于静态举个例子,如下

 

classPerson

{

       private Person(){}

       private String name = "hah";

       private int age;

       private static  String country = "cn";//将静态变量私有

       Person(String name,int age)//构造函数

       {

              this.name = name;

              this.age = age;

       }

       {

              System.out.println(name+".."+age);

       }

       public void setName(String name)

       {

              this.name = name;

       }

       public void speak()

       {

              System.out.println(this.name+"..."+this.age);

       }

       public static void  showCountry()//静态函数

       {

              System.out.println("country="+Person.country);

              Person.method();//类名.静态方法

       }

       public static void method()

       {

              System.out.println("methodrun");

       }

}

class  PersonDemo

{

       public static void main(String[] args)

       {

              Person p = newPerson("zhangsan",20);

              p.setName("lisi");

              new Person();

       }

}

h).静态代码块

就是一个由静态关键字标示的一个代码块区域,定义在类中。

作用:是用于给类进行初始化的,随着类的加载而执行,只执行一次,并优先于主函数。

i).代码块相关知识点

1.普通代码块

当方法执行结束时,在方法体中的变量就会消失。

2.构造代码块

构造代码块在对象建立的同时,就会执行。

3.静态代码块

      在定义一个类时,如果希望一使用这个类,就执行一段代码,那么就可以将代码放在静态代码块中。静态代码块在类加载时就执行。

j).静态代码块、构造代码块、构造函数同时存在时的执行顺序:静态代码块--->  构造代码块---->构造函数.

k).练习,写出程序运行的结果并作简单的分析。

class Parent {

//静态变量

public static String p_StaticField="父类--静态变量";

// 变量

public String p_Field="父类--变量";

//静态初始化块

static {

   System.out.println(p_StaticField);

   System.out.println("父类--静态变量初始化块");

}

//初始化

{

   System.out.println(p_Field);

   System.out.println("父类--初始化块");

}

Parent(){

   System.out.println("父类--构造器");

}

Parent(int x){

   System.out.println("父类--构造器"+x);

}

}

  public class Sub  extends Parent{

  public static void main(String[] args) {

  new Sub ();

}

// 静态变量

public static String s_StaticField="子类--静态变量";

//变量

public String s_Field="子类--变量";

//静态初始化

static {

  System.out.println(s_StaticField);

  System.out.println("子类--静态初始化块");

}

//初始化

{

   System.out.println(s_Field);

   System.out.println("子类--初始化");

}

Parent p=new Parent(12);

//构造器

Sub (){

   System.out.println("子类--构造器");

   }

}

运行结果是:

父类--静态变量

父类--静态变量初始化块

子类--静态变量

子类--静态初始化块

父类--变量

父类--初始化块

父类--构造器

子类--变量

子类--初始化

父类--变量

父类--初始化块

父类--构造器12

子类--构造器

分析执行过程:

main方法中创建了new Sub();对象,程序先去Sub类的无参构造函数,接着会执行默认的super()方法,到父类后会先看父类中有没有构造代码块,有就会先执行,然后再执行父类的无参构造函数。接着返回到Subs类中,再查看Sub类中有没有构造代码块,有就会执行,接着new Parent(12)对象,到父类中后,先执行父类中构造代码块,再去执行父类中的有参构造函数。接着返回子类,再去执行子类的无参构造函数。

代码块总结:

    1.并不是父类完全初始化完毕后才进行子类的初始化的。实际上是子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化  之前就完成了;

2.静态代码块在整个程序中只执行一次,而构造代码块会随着对象的创建而去执行;

3.子类的每个构造函数里都会有个默认的super();

4.静态代码块会先于构造代码块执行,构造代码块会先于构造函数执行。

对象的初始化过程

Personp = new Person("zhangsan",20);

该句话都做了什么事情?

1,因为new用到了Person.class.所以会先找到Person.class文件并加载    到内存中。

2,执行该类中的static代码块,如果有的话,给Person.class类进行初          始化。

3,在堆内存中开辟空间,分配内存地址。

4,在堆内存中建立对象的特有属性。并进行默认初始化。

5,对属性进行显示初始化。

6,对对象进行构造代码块初始化。

7,对对象进行对应的构造函数初始化。

8,将内存地址付给栈内存中的p变量。

生成Java帮助文档

命令格式:javadoc-d文件夹名(存放的目录)-anther-version*.(必须是  public类型的类)

一个类中默认的是有一个空参数的构造函数,这个构造函数的权限和类的    权限一致。

Main函数

1.主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用。

2.主函数的定义:

a)       Public:代表着该函数的访问权限是最大的;

b)       Static:代表着主函数随着类的加载就已经存在了;

c)       Void:主函数没有具体的返回值;

d)      Main:不是关键字,但是是一个特殊的单词,可以被jvm识别;

e)       (string[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串(字符串类型的数组)。

注意:主函数是有固定的格式的该格式是:publicstatic void main(string[] args),因为只要有这种格式jvm才识别。

jvm在调用主函数时,传入的是new string[0]

 

------- android培训java培训、期待与您交流! ---------- 

 

 

0 0
原创粉丝点击