构造方法

构造方法

 
啥是构造? 为什么要有构造方法?
 
上节课我们写了一辆车. 车的颜色. 排量等信息都是创建完车之后. 再给车设置的. 但是大家想想, 这些车的信息在出厂的时候应该就已经是设置好的了. 不应该在外面进行一个一个的设置. 所以, 在车辆在出厂的时候. 可以给车设置好一些属性信息. 这就是构造. 构造的意义就是可以帮我们在创建对象的时候给对象传递一些信息.
 
构造方法的语法:
public 类名(参数….){
}
 
 
注意: 构造方法的名字必须和类名一致.
 
public class Car {
    public Car() {
        System.out.println("构造方法");
    }
    public static void main(String[] args){
        Car p = new Car();

    }
}

 



构造能干嘛?
 public class Car {
    String name;
    String color;
    int seat;

    public Car(String name, String color, int seat) {
        this.name = name;
        this.color = color;
        this.seat = seat;
        System.out.println("构造了一辆车");
    }

    public static void main(String[] args) {
        Car p = new Car("大黄蜂", "绿色", 5);
        System.out.println(p.name + p.color + p.seat);
    }
}

 

 
总结: 构造方法存在的意义就是在对象在创建的时候给对象设置一些属性.
注意: 每个类都会有构造方法. 如果不写, java会自动赠送一个免费的没有参数的构造方法.
但是, 如果你自己写了构造方法了. 系统就不送了.
  

构造方法的重载

 
想这么一个事儿, 我们可以在创建对象的时候给对象传递一些信息, 通常都是在构造方法里设置一些属性. 那如果现在我写一个”大侠”类, 里面会有很多个属性,
 
 public class DaXia{
     String name;
     String waihao;
     int age;
     String bangPai;
 }
好了, 接下来我们去创建大侠, 比如, 创建一个"岳不群", 那在创建岳不群的时候, 需要给出: 名字, 年龄, 帮派.
外号和口头禅对于岳不群而言都不需要. 那如果是创建一个武松呢? 需要给出: 名字, 年龄, 帮派,外号. 这就会产生一个分歧. 有些大侠有外号, 有些大侠没有外号. 对吧. 并且, 我们知道在创建对象的时候. 我们是默认调用构造方法的. 那就需要我们写两个构造方法来满足两种不同的大侠. 但是构造方法的名字还必须是类名. 也就意味着, 我们要写两个名字相同的方法. 咱们在上一章里学过, 方法的名字相同参数的个数或者类型不同, 叫方法的重载. 没错, 这里需要我们重载构造方法.
 
public class DaXia {
    String name;
    int age;
    String bangPai;
    String nickname;

    public DaXia(String name, int age, String bangPai) {
        this.name = name;
        this.age = age;
        this.bangPai = bangPai;
    }

    public DaXia(String name, int age, String bangPai, String nickname) {
        this.name = name;
        this.age = age;
        this.bangPai = bangPai;
        this.nickname = nickname;
    }
}

 

聪明的你应该又发现一个问题. 两个构造方法的写法太像了. 能不能简化一下呢? OK. 没问题. 我们还可以使用this来调用当前类中的其他构造方法
 
public class DaXia {
    String name;
    int age;
    String bangPai;
    String nickname;

    public DaXia(String name, int age, String bangPai) {
        this.name = name;
        this.age = age;
        this.bangPai = bangPai;
    }

    public DaXia(String name, int age, String bangPai, String nickname) {
        this(name, age, bangPai);
        this.nickname = nickname;
        System.out.println(this.name + this.age + this.bangPai + this.nickname);
    }

    public static void main(String[] args) {
        DaXia p = new DaXia("乔峰", 23, "少林", "乔帮主");
    }
}

 

 
this的两个作用:
表示当前类的对象, 可以访问成员变量和成员方法
可以调用当前类中的其他构造方法
 

static

 
static表示静态. 被static修饰的变量会被所有的对象共享, 并且, 在内存里只会保留一份.
 
public class Person {
    String name;
    String address;
    static String country = "大清";

    public Person(String name, String address) {
        this.name = name;
        this.address = address;

    }


    public static void main(String[] args) {
        Person p1 = new Person("张麻子", "北京四合院");
        Person p2 = new Person("黛西", "北京大裤衩");
        Person.country = "民国";
        System.out.println(p1.country);
        System.out.println(p2.country);

    }


}

 

 
小总结:
静态变量并不属于对象, 它属于类. 并且在内存中是共享的. 所有对象都可以访问和使用静态变量.
那如果用static来修饰方法呢? 其实是一样的. 我们用类名去访问静态变量, 同样, 我们也使用类名去访问静态方法.
 
 public class Person{
     public static void huo(){
         System.out.println("是人都想火");
     }
     public static void main(String[] args){
         huo(); // 由于是自己类. 可以直接访问静态方法
         Person.huo();// 最好呢, 还是用类名去访问. 
     }
 }
类中内容的加载顺序(简单):
 
 public class Person{
     {
         System.out.println("我是通用构造器");
     }
     static {
         System.out.println("我是静态构造器");
     }
     public Person(){
         System.out.println("我是构造方法");
     }
     public static void main(String[] args){
         new Person();
     }
 }

 

在创建对象的时候, 首先加载的是静态的内容, 然后才是非静态内容.
这也就导致一个问题. 静态内容在创建的时候, 还没有对象产生, 所以:
在静态方法里, 不能使用this.
也不能直接调用自己类中的其他成员(方法, 变量). 但是反过来是可以的.
 
重点: 静态的东西不属于对象, 直接属于类, 优先于对象产生. 使用的时候使用类名去访问.
 
 
 
 
 
posted @ 2020-01-14 15:27  元贞  阅读(260)  评论(0编辑  收藏  举报