DUFQ_2020.12.07-杜飞强-构造方法

构造方法

定义

如果类内的方法名称与类名相同,并且没有返回值类型,也不写void,那么这个方法就叫做构造方法,或构造函数。

构造方法分为默认构造方法和自定义构造方法。

作用

构造方法的作用是在创建对象时,为对象的成员变量初始化

定义语法格式

[访问修饰符] 方法名 ([参数列表]){

​ 方法体;

}

eg:

public class Person {
    public int age;
    public String name;
    //定义一个构造函数
    public Person(){
        this.name = "宋江";  //初始化
        this.age = 22;      //初始化
    }
}

PS:1.构造方法没有返回值

​ 2.默认构造方法没有参数

​ 3.构造方法的方法名必须与类名相同

构造方法的调用规则

1.实例化对象时,必须调用类的构造方法,即只要new对象,就一定会调用构造方法。

2.如果类中没有显示定义的构造方法,那么JVM会为类自动定义无参数的构造方法,如果类中显示定义了任意一个构造方法,那么,JVM就不会为类定义默认构造方法。

3.构造方法是在实例化对象时自动调用的,或者在本类的其他构造方法中通过this关键字调用。

eg:

4.构造方法不允许使用对象直接调用。

5.构造方法调用时根据参数匹配原则调用相应的构造方法。

this关键字

this关键字是对一个对象的默认引用。每一个实例方法内部都有一个this引用变量,指向调用这个方法的对象。

PS:(1)this是java的关键字,表示当前正在运行的对象。

(2)this指代当前对象的引用。

this的三种调用

(1)使用this调用成员变量,解决成员变量与局部变量的同名冲突

public class Person {
    public String name;
    public void setName(String name){
        //成员变量与局部变量同名,this.naem表示成员变量,name表示局部变量
        this.name = name;
    }
}

public class Person{
    public String name;
    public void setName(String str){
        //成员变量与局部变量不同名,this可以省略
        name = str;
    }

(2)使用this调用成员方法

public class Person(){
    public void eat(){

    }
    public void work(){
    this.eat();this调用成员方法,可以省略this
    }
}

(3)使用this调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句

public class Person{
    public String name;
    public int age;
    public Person(String name){
        this.name = name;
    }
    public Person(String name,int age){
        this(name);//调用重载的构造方法,必须放在第一条语句
        this.age = age;
    }
}

构造方法重载

public class Test {
    public String name;
    public int age;
    public String gender;
    //第一种构造方法重载:定义无参数构造方法
    public Test(){
        this.name = "宋江";
    }
    //第二种构造方法重载:定义带参数构造方法
    public Test(String name){
        this.name = name;
    }
    //第一种work()方法重载,无参的work()方法
    public void work(){
        System.out.println(this.name+"的工作理念:工作让生活更美好!");
    }
    //第二种work()方法重载,带参数的work()方法
    public void work(String contect){
        System.out.println(this.name+","+this.gender+","+this.age+"岁的工作理念:"+contect);
    }

    public static void main(String[] args) {
        Test t = new Test("宋江");//调用Test带有参数的构造方法
        System.out.println("大家好,欢迎"+t.name+"的到来");
        Scanner sc = new Scanner(System.in);
        System.out.println("请选择性别:(1、男,2、女)");
        switch(sc.nextInt()){
            case 1:
                t.gender = "男";//为t对象的性别属性赋值
                break;
            case 2:
                t.gender = "女";//为t对象的性别属性赋值
            default:
                    System.out.println("输入错误");
                    return;
        }
        System.out.println("请输入年龄:");
        t.age = sc.nextInt();
        t.work();//调用无参的work()方法
        System.out.print("请重新输入您的工作理念:");
        String contect = sc.next();
        t.work(contect);//调用带参数的work()方法
    }
}

构造方法间的调用

调用本类的构造方法使用this(),调用父类的构造方法使用super(),但必须写在构造方法内的第一行代码,否则不能编译。

public Score(int lishi) {
            this.lishi = lishi;
        }
   public Score() {
            this(5);
        }
   public Score(int a,int b) {
            super();
        }

调用错误示例

封装

封装的含义

封装是面向对象的三大特征之一,封装的实质就是将类的状态信息(成员变量)隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息(成员变量)的操作和访问。

数据保护方式

1.不允许读,不允许写

2.允许读,不允许写

3.不允许读,允许写

4.允许读,允许写

方法被调用的情况

1.类内的其他方法是否可以调用

2.同包中的其他类是否可以调用

3.子类是否可以调用

4.任务类是否可以调用

封装的实现

封装是通过访问修饰符来实现的,共有4个,分别是:

public修饰符 可以修饰属性、方法、类

默认修饰符 可以修饰方法属性、类

protected修饰符 可以修饰方法、属性、类

private修饰符 可以修饰属性、方法,类

private访问修饰符

可以修饰属性、方法,但不可以修饰类。

eg:修饰了属性和方法

public class Person {
    private String name;
    private int age;
    private String gender;
    private void show();

private的使用规则:private修饰的属性或方法只允许在类内被访问。private是最严格的封装。

public修饰符

public表示共有、公共的意思,由public访问修饰符修饰的属性或方法或类可以在任何地方被调用。public是最开放的封装。

默认访问修饰符

默认是指类、属性、方法定义时不写任何访问修饰符,此时就是默认。

由默认访问修饰符修饰的类、属性、方法可以被同包的其他类访问。

protected修饰符

由protected修饰符修饰的属性、方法和类可以被子类和同包中其他的类访问,但不能在位于其他包中的非子类中访问。

类和类成员的访问控制

(1)类的访问修饰符

java这种类的访问修饰符只有两个,分别是public和默认修饰符

作用域/修饰符 同一包中 不同包中
public 可以使用 可以使用
默认修饰符 可以使用 不可以使用
(2)类成员的访问修饰符
位置 public protected 默认修饰符 private
同类访问 可以访问 可以访问 可以访问 可以访问
同包其他类访问 可以访问 可以访问 可以访问 不可以访问
同包子类访问 可以访问 可以访问 可以访问 不可以访问
不同包子类访问 可以访问 可以访问 不可以访问 不可以访问
不同包非子类访问 可以访问 不可以访问 不可以访问 不可以访问

PS:访问修饰符不能用于方法中声明的变量或形式参数,因为方法中声明的变量或形式参数的作用域仅限于该方法,在方法外是不可见的,在其他类无法访问。

封装最常用的方法:共有方法封装私有属性

需求:在教务系统中,学生对成绩只能查询,不能修改。

分析:成绩在成绩类中使用private封装,此时成绩类外不能访问成绩属性。为成绩属性提供一个共有的方法,这个共有的方法返回成绩的值。此时成绩类外可以通过共有的方法获得私有的成绩。这种封装称为共有方法封装私有属性。

代码:

public String getGender() {
    return gender;
}

public void setGender(String gender) {//public封装方法
    this.gender = gender;
    if ("男".equals(gender) || "女".equals(gender)){
        this.gender = gender;//public方法中返回private属性
    }else{
        System.out.println("性别不合法");
    }
}
//定义构造方法
public Person(String naem,int age,String gender){
    this.name = name;
    this.gender = gender;
    this.age = age;
}

如果只提供get方法,不提供set方法,表示只读不写

如果只提供set方法,不提供get方法,表示只写不读

如果提供了get方法和set方法,表示可读写

如果get方法和set方法都不提供,表示不可读写

PS:如果一个类中有多个属性,可以使用开发工具IDE一键生成属性的get方法和set方法。

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1