构造的详解

构造的定义

在一个类中的定义的方法如果同时满足以下3个条件,该方法称为构造方法,具体如下

1. 方法名与类名相同
2. 在方法名的前面没有返回值类型的声明
3. 在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束

例 如:

public class Example05 {
    public static void main(String[] args) {
        Person person = new Person();
    }
}
class Person{
    public Person() {
        System.out.println("无参构造方法被调用了...");
    }
}

一个类中除了定义无参的构造外方法,还可以定义有参的构造方法,通过有参的构造方法就可以实现对属性的赋值

public class Example06 {
    public static void main(String[] args) {
        Person1 p = new Person1(20);
        p.show();
    }
}
class Person1 {
    int age;
    //定义有参的构造方法
    public Person1(int a) {
        age=a;    //age为a的赋值
    }
    public void show() {
        System.out.println("我今年已经"+age+"岁了");
    }
}

构造方法的重载

在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数的个数不同即可。在创建对象时,可以通过调用不同的构造方法为不同的属性进行赋值。

class Person{
    String name;
    int age;
    public Person(String con_name, int con_age) {
        name = con_name;            //为name属性赋值
        age = con_age;                //为age属性赋值
    }
    public Person(String con_name) {
        name = con_name;            //为name属性赋值
    }
    public void show() {
        //同时打印name和age的值
        System.out.println("大家好,我叫"+name+",我今年"+age+"岁了");
    }
}
public class Example07 {

    public static void main(String[] args) {
        //分别创建两个对象ps1和ps2
        Person ps1 = new Person("小明");
        Person ps2 = new Person("小红", 18);
        //通过对象ps1和ps2调用show()方法
        ps1.show();
        ps2.show();
    }
}

this关键字

Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其他成员

1. 通过this关键字可以明确地区访问一个类的成员变量,解决与局部变量的名称冲突问题,在构造方法中如果使用"age",则是访问局部变量,但如果使用"this.age"则是访问成员变量

public class this01 {
    int age;
    public this01(int age) {
        this.age = age;
    }
    public int getAge() {
        return this.age;
    }
}

2. 通过this调用成员方法,可以省略不写

public class this02 {
    public void openMouth() {
    }
    public void show() {
        this.openMouth();
    }
}

3. 可以在一个构造方法中使用"this([参数1],[参数2]...)"的形式去调用其他的构造方法

class Person{
    public Person() {
        System.out.println("无参构造方法被调用了...");
    }
    public Person(String name) {
        this();
        System.out.println("有参构造方法被调用了");
    }
}
public class this03{
    public static void main(String[] args) {
        Person p = new Person("hahaha");
    }
}

在使用this调用类的构造方法时,应该注意以下几点:

1. 只能在构造方法中使用this调用其他构造方法,不能在成员方法中使用
2. 在构造方法中,使用this调用构造方法的语句必须位于第一行,且只能出现一次
3. 不能在一个类的两个构造方法中使用this相互调用

static关键字

在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。
在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量,静态变量被所有实例共享,可以使用 "类名.变量名" 的形式来访问。

class Student{
    static String schoolName;
}
public class Example12 {
    public static void main(String[] args) {
        Student stu1 = new Student();
        Student stu2 = new Student();
        Student.schoolName="黄冈科技";
        //打印第一个对象的学校
        System.out.println("第一个对象的学校是"+stu1.schoolName);
        System.out.println("第二个对象的学校是"+stu2.schoolName);
    }
}

注 意 :

static关键字只能用于修饰称成员变量,不能用于修饰局部变量,否则会报错

静态方法

静态方法可以在不创建对象的情况下直接调用,使用static修饰,称为静态方法,使用 "类名.方法名" 来访问

class Person{
    public static void sayHello() {    //定义静态方法
        System.out.println("hello");
    }
}
public class Example13 {
    public static void main(String[] args) {
        //1.类名.方法名的方式调用静态方法
        Person.sayHello();
        //2.实例化对象的方式来调用静态方法
        Person p = new Person();
        p.sayHello();
    }
}

注 意 :

在一个静态方法中只能访问static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法被调用时可以不创建任何对象。

public class Example14 {
    static {
        System.out.println("测试类的静态代码块执行了");
    }
    public static void main(String[] args) {
        //创建两个Person类对象  但是静态代码块只会执行一次
        Person1 p1 = new Person1();
        Person1 p2 = new Person1();
    }
}
class Person1{
    static {
        System.out.println("Person的静态代码块");
    }
}

成员内部类

在一个类中除了可以定义成员变量、成员方法外,还可以定义类,这样的类被称为成员内部类。在成员内部类中,可以访问外部类的所有成员。

class Outer{
    private int num=4;   //定义类的成员变量
    //定义一个成员方法,方法中访问内部类
    public void test() {
        Inner inner = new Inner();
        inner.show();
    }
    class Inner{
        public void show(){
            //在成员内部类的方法中访问外部类的成员变量
            System.out.println("num="+num);
        }
    }
}
public class Example15 {
    public static void main(String[] args) {
        Outer outer = new Outer();         //创建外部类对象
        outer.test();    //调用test方法
    }
}

如果想通过外部类去访问内部类,则需要通过外部类对象去创建内部类对象,创建内部类对象的具体语法格式如下:

外部类名.内部类名 变量名 = new 外部类名().new 内部类名 ()

示 例:

public class Example16 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();   //创建内部类对象
        inner.show();
    }
}

 

posted @ 2019-10-13 21:07  tunan96  阅读(597)  评论(0编辑  收藏  举报