首页 专题 文章 代码 归档
Java 面向对象-属性与方法
2020.02.26 11:10 2020.03.01 17:24

1. 属性

前面说了,我们表示一个人,可以为这个人赋予不同的属性(特点)

那么一个人最基本的特点是什么?

  • 姓名
  • 年龄
  • 性别

那,我们来定义一个人类:

Person.java

public class Person {
    public String name;
    public int age;
    public String gender;


}

主函数里面测试:Main.java

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        // 这是为各属性赋值
        person.age = 12;
        person.name = "迷思爱";
        person.gender = "男";

        System.out.println("您的姓名:" + person.name);
        System.out.println("您的年龄:" + person.age);
        System.out.println("您的性别:" + person.gender);
    }
}

截图-1582684625

看到了么,上面就是最简单的封装(Person.java),以及我们在主函数里面,new 出来了一个真正的对象。

前面说了,人类,具有一些共同的属性(特点),人,都有姓名、年龄、性别(不考虑特殊的哈);

既然具备了共同的属性,那么就到达了基本的封装条件。

而我们在Main函数里面,就实例化了一个对象:

Person person = new Person();
// 这是为各属性赋值
person.age = 12;
person.name = "迷思爱";
person.gender = "男";

并为他赋予了自己独有的一些属性,使他成了一个特殊的对象。

这就是从特殊到普遍(封装),然后从普遍到特殊(实例化)

2. 访问修饰关键字

其实上面的Person.java的写法最起码有两大问题:

  1. 使用public修饰属性,破坏了封装性。
  2. 在Main方法中我们是通过"对象.属性"赋的值,这也是不允许的。

这是因为:

封装核心思想就是“隐藏细节”、“数据安全”:将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。

具体的实现方式就是:

使用 private 修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public 的 set 和 get 方法按照开发者的意愿(可以编写一些业务逻辑代码,虽然很少这样做)设置和获取成员变量的值。

也可以把只在本类内部使用的方法使用 private,这就是封装的思想,是面向对象最基本的开发规范之一。

当然,这里就需要提到 Java 的访问权限修饰关键字;Java 中主要有 private、protected、public 和 默认访问权限。

  • public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
  • protected 修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
  • default 修饰符,主要是本包的类可以访问。
  • private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。

截图-1582685492


所以,其实上面的Person.java,我们应该这么来写:

public class Person {
    private String name;
    private int age;
    private String gender;
}

这样写了后,Main方法就会报错:

截图-1582685393

这是因为private 修饰符,访问权限仅限于本类内部。


那么外部类如何来设置、使用这些属性呢?

通过方法来!

3. 方法

3.1. 构造方法

构造方法,也叫构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载

特点、书写注意:

  • 构造函数的名称必须与类名相同,包括大小写;
  • 构造函数没有返回值,也不能用void修饰. 如果不小心给构造函数前面添加了返回值类型,那么这将使这个构造函数变成一个普通的方法,在运行时将产生找不到构造方法的错误。
  • 一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
  • 构造方法可以重载,以参数的个数类型顺序

所以添加构造方法后的Person.java,就变成:

public class Person {
    private String name;
    private int age;
    private String gender;


// 无参构造
    public Person() {
    }
// 有参构造
    public Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}

Main.java

public class Main {

    public static void main(String[] args) {
    // 在new的时候,就传入属性参数
    // 这也是构造函数的作用,初始化一些属性的值
        Person person = new Person("迷思爱", 13, "男");

    }
}

3.2. 普通方法

普通方法和构造方法的写法一致:

访问修饰符 返回值类型 方法名(){
// 方法主体内容
}

getter和setter

上面的Person.java类中,我们使用了构造方法传入参数,但是这样我们在其他类中依然无法获取这些值和设置这些值,这是就需要用到getter(获取值)、setter(设置值)

public class Person {
    private String name;
    private int age;
    private String gender;


    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

setter和getter方法,和普通方法一样,并无特殊;最多特殊的是,前面约定俗成的加了get和set;

这样,我们在Main方法里面就可以直接写:

public class Main {

    public static void main(String[] args) {
        Person person = new Person("迷思爱", 13, "男");
        System.out.println("您的名字:"+person.getName());
        System.out.println("您的年龄:"+person.getAge());
        System.out.println("您的性别:"+person.getGender());
    }

}

截图-1582686179


当然,此时我们也就可以通过set方法来修改一些属性了:

public class Main {

    public static void main(String[] args) {
        Person person = new Person("迷思爱", 13, "男");


        System.out.println("您的名字:"+person.getName());
        System.out.println("您的年龄:"+person.getAge());
        System.out.println("您的性别:"+person.getGender());
        person.setAge(18);// 我们这里也就可以通过set方法来修改年龄了
        System.out.println("您的年龄:"+person.getAge());
        /*
        *   您的名字:迷思爱
            您的年龄:13
            您的性别:男
            您的年龄:18
        * */
    }

}

4. Java的包

开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。

通过package定义该类所在的包,通过import语句导入某个包的某个类;

截图-1582686473

然后使用时,我们就需要引入该包:

截图-1582686595

源文件申明规则:

  • 一个源文件中只能有一个public类
  • 一个源文件可以有多个非public类
  • 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
  • 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
  • import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
本节阅读完毕! (分享
二维码图片 扫描关注我们哟