07 构造函数与this,static

构造函数:

    特点:1.函数名与类名相同,

          2.不用定义返回值类型,

    3.没有具体的返回值.(第2条已经说明了第3条)

作用:对对象进行初始化,构造函数是构建创造对象时调用的函数,创建对象都必须要通过构造函数初始化.

  一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数.

  如果在该类中定义了指定的构造函数,那么类中的默认构造函数就没有了.

构造函数vs一般函数:

  构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化.

  一般函数:对象创建后,需要函数功能时才调用.

  构造函数:对象创建时, 会调用且只调用一次.

  一般函数:对象被创建后,可以多次调用.

什么时候定义构造函数呢?

在描述事物时,该事物一存在就具备一些内容,这些内容都定义在构造函数中.

构造函数的重载:

  接受参数.

class Person
{
    private String name;
    
    private int age;
    
    //定义一个Person类的构造函数;
    Person()
    {
        name= "baby";
        age = 1;
        System.out.println("person run");
    }
    
    Person(String n)
    {
        name= n;
    }

    Person(String n,int a)
    {
        name=n;
        age = a;
    }

  //一般方法
  public void setName(String n)
  {
    name = n;
  }
public void speak() { System.out.println(name+":"+age); } } class Demo { public static void main(String[] args) { Person p = new Person(); p.speak(); Person p1 = new Person("旺财"); p1.speak(); Person p2 = new Person("小强",10); p2.speak(); } }

构造函数可以调用一般函数,一般函数不能调用构造函数,如果需要调用需要创建对象,但不要这么做.

构造函数有return语句,结束函数,一般不写.用于判定参数是否符合规范,不符合return出去.

 

this关键字:当成员变量和局部变量重名,可以用关键字this来区分.

  this:代表对象,代表哪个对象?当前对象.

    this就是所在函数所属对象的引用.

    简单说:哪个对象调用了this所在的函数,this就代表哪个对象.

  

 构造函数调用构造函数:this(参数)既可.

细节:

1.this也可以用于在构造函数中调用其他构造函数,

但对this的调用必须放在构造函数的第一行.

为什么?

   因为初始化动作要先执行.避免覆盖.

2.不要两个构造函数在内部互相调用,会造成程序的停止.

 

一个类中所有的成员,想要被执行,就必须有对象调用(静态除外);

 

static关键字:

  static的特点:

1.static是一个修饰符,用于修饰成员.(包括成员变量和成员函数).

2.static修饰的成员被所有的对象所共享.

3.static优先于对象存在,因为static的成员随着类的加载就已经存在了.

4.static修饰的成员多了一种调用方式,可以直接被类名所调用,类名.静态成员.

5.static修饰的数据是共享数据,对象中存储的是特有数据.

  类中普通的变量称为成员变量,实例变量

  类中的static变量称为静态变量,类变量

成员变量和静态变量的区别?

1.两个变量的生命周期不同.

成员变量随着对象的创建而存在,随着对象的被回收而释放.

静态变量随着类的加载而存在,随着类的消失而消失.

2.调用方式不同.

成员变量只能被对象调用.

静态变量可以被对象调用,还可以被类名调用.(建议不要用对象调用,一目了然知道这个变量是静态成员)

3.别名不同.

成员变量也称为实例变量.

静态变量称为类变量.

4.数据的存储位置不同.

成员变量存储在堆内存的对象中,所以也叫对象的特有数据.

    (堆里面放的全部是实体,栈用完会立刻释放,生命周期较短)

静态变量数据存储在方法区(数据区,共享区,共享数据区)的静态区中,所以也叫对象的共享数据.

 

静态使用的注意事项:

1.静态方法只能访问静态成员.访问不了非静态(因为非静态随着对象的产生而产生,此时还没有非静态成员)

非静态既可以访问静态,又可以访问非静态.

2.静态方法中不可以使用this或者super关键字.(没有对象)
3.主函数是静态的.(在主函数中通过new别的对象来调用相应的对象中的方法);

主函数特殊之处:

1.格式是固定的.

2.被jvm所识别和调用.

 

public:因为权限必须是最大的.

static:虚拟机(jvm)在调用主函数时不需要对象.直接用主函数所属类名调用即可.

void:主函数没有具体的返回值.

main:函数名,不是关键字,只是一个jvm识别的固定的名字.

String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串.

打印出来是:   [Ljava.lang.String;@1db9742

@后面是哈希值,代表地址.

[数组

实际是 new String[0];

字符串类型的数据才是最通用的数据.

可以在控制台通过java Demo (传值),用空格隔开.

 

只有非静态区才持有this

static内存图解:

到底什么时候写静态.

1.静态变量

  当分析对象中所具备的成员变量的值都是相同的.

  这时这个成员就可以被静态修饰.

  只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的.

  如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中.

2.静态函数

   函数是否用静态修饰,就参考一点,就是该函数功能是否有访问到对象中的特有数据.

   简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的.

如果不需要,就可以将该功能定义成静态的.当然也可以定义成非静态,但是非静态需要被对象调用,

而仅创建对象调用非静态的,没有访问特有数据的方法,该对象的创建是没有意义的.

 

静态代码块:随着类的加载而执行.而且只执行一次.\

作用:用于给类进行初始化.

static

{
  System.out.println("hahahh");
}

构造代码块:

  可以给所有对象进行初始化

构造函数是给对应的对象进行针对性的初始化,构造代码块是给所有对象进行初始化.

执行顺序:静态代码块>构造代码块>构造函数

 

 

 

  

posted on 2016-11-27 22:43  夜行锦衣  阅读(95)  评论(0编辑  收藏  举报

导航