java类的引入

对比:  

 

构造方法:完成对象的初始化,不是创建对象(在调用构造器时空间已经分配好了);在创建对象的时候,系统会自动调用该类的构造器

  1. 方法名和类名相同

  2. 方法没有返回值,且用public修饰

  3. 可以有任意多个参数(默认是没有参数)

  注:可以有多个构造函数,一旦定义了自己的构造器,默认的构造器就被覆盖了,就不能再使用默认的无参构造器,除非显示的定义下

class Person {
    String name;
    int age;
    String getName() {
     this.getAge();//this来访问成员方法
return "guangdong "+name; }
  
  int getAge(){
    System.out.println("this age");
  }
/* construct method */ public Person () {/* 显示定义无参的构造器*/ name = "null"; age = 0; } public Person (String name) {//带一个参数的构造方法
     this("wangwu", 16);//可以在本类中的一个构造器中访问本类中的另一个构造器,且this(参数列表)要放在构造器中的第一句
this.name = name; } public Person (String name, int age) {//带两个参数的构造方法 this.name = name;//区分当前类的属性和局部变量,如上面的解释 this.age = age; } }; public class Oop3 { public static void main(String args[]) { Person p1 = new Person("zhangsan");//在实例化p1对象时,带一个参数的构造方法被调用 Person p2 = new Person("lisi"); Person p3 = new Person();//在实例化p3对象时,带没有参数的构造方法被调用 Person p4 = new Person("wangwu", 6);//在实例化p4对象时,带两个参数的构造方法被调用 System.out.println(p1.getName()); System.out.println(p2.getName()); System.out.println(p3.getName()); System.out.println(p4.getName()); } }

this关键字:

  表示当前对象/当前类的属性,如上面person类中的name和age,this.name就表示当前类中的属性name;this.age就表示当前类中的属性age,所以用同名的name和age赋值就不会有冲突,如果没有this,那么name = name,根据变量的就近原则,这两个name都表示参数中的name,就不对。

  1. this关键字可以用来访问本类中的属性、方法、构造器

  2. this用于区分当前类的属性和局部变量,如上面的解释。

  3. 可用this来访问成员方法,如this.方法名(参数列表)

  4. 访问构造器,可以在本类中的一个构造器中访问本类中的另一个构造器,且this(参数列表)要放在构造器中的第一句

  5.this不能在类定义的外部使用,只能在类定义的方法中使用

 

static关键字:

  static修饰方法,叫做类方法,即可以不用实例化对象就可直接通过类.方法名直接调用

     1. 静态方法中不允许使用和对象有关的关键字,如this、super

     2. 静态方法中只能访问静态变量和静态方法

     3. 普通方法可以访问普通变量(方法),也可以访问静态变量(方法)

      即静态方法只能访问静态成员;非静态方法既可以访问静态成员,也可以访问非静态成员

  static修饰属性,叫做类属性(静态变量),也可以不用实例化对象就可直接通过类.属性名直接调用

    1. 静态变量是同一个类所有对象共享,任何一个对象去访问它时,取到的都是相同的值

    2. 静态变量在类加载时就生成了(可以在堆中,也可以在方法区的方法域中,这要看jdk的版本),所以即使没有创建对象实例,也可以通过类名.类属性名访问

    3. 类变量的生命周期随类的加载开始,随着类的消亡而销毁

静态变量在内存中的布局:

  注:main方法就是用static修饰的,所以JVM不用实例化对象就能直接调用main函数了

class Person {
    static int count;//类属性
    
    String name;
    int age;
    String getName() {
        return "guangdong "+name;
    }

    /* construct method */    
    public Person () {
        count++;
        name = "null";
        age  = 0;
    }

    public Person (String name) {
        count++;
        this.name = name;
    }

    public Person (String name, int age) {
        count++;
        this.name = name;
        this.age  = age; 
    }

    static void printPerson () {//类方法
        System.out.println("This is a class of Person");
    }
    
};

public class Oop4 {
    public static void main(String args[]) {
        Person p1 = new Person("zhangsan");
        Person p3 = new Person();
        Person p4 = new Person("wangwu", 6);

        System.out.println(p1.getName());
        System.out.println(p3.getName());
        System.out.println(p4.getName());

        Person.printPerson();//调用类方法或类属性可以不用实例化对象
        System.out.println(Person.count);
    }
}

 

代码块:另外一种形式的构造器(对构造器的补充机制),做初始化操作。如果每个构造器中都有的重复语句,可以放到代码块中,提高代码重用性

  普通代码块:先于构造函数执行,且每实例化一个对象就被隐式调用一次

  静态代码块:随着类的加载而执行,先于构造代码块执行,且只会执行一次

  静态代码块只能调用静态成员;普通代码块可以调用任意成员
class Person {

    static int count;
    
    String name;
    int age;
    String getName() {
        return "guangdong "+name;
    }

    static {//静态代码块
        System.out.println("static block");        
    }

    {//普通代码块
        System.out.println("construct block");
        count ++;
    }

    /* construct method */    
    public Person () {
        System.out.println("construct method: Person 1");
        name = "null";
        age  = 0;
    }

    static void printPerson () {
        System.out.println("This is a class of Person");
    }    
};
public class Oop5 { public static void main(String args[]) { Person p3 = new Person(); System.out.println(p3.getName()); Person.printPerson(); System.out.println(Person.count); } }

 

posted @ 2023-05-29 21:34  踏浪而来的人  阅读(68)  评论(0编辑  收藏  举报