欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java-封装

程序员文章站 2022-04-01 18:49:52
一.封装的简单理解  将类的某些信息隐藏在类的内部,不允许外部程序直接访问,并通过该类提供的方法来实现对隐藏信息的操作和访问。(简单的说就是隐藏对象的信息,留出访问的接口)。  特点:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现。  注:只有getxxx的属性是只读属性,只有setxxx的属性是只写属性  例:View Codepackage com.imooc.animals;public class Cat { //成员属性:昵称,年龄,体重,品种...

一.封装的简单理解
  将类的某些信息隐藏在类的内部,不允许外部程序直接访问,并通过该类提供的方法来实现对隐藏信息的操作和访问。(简单的说就是隐藏对象的信息,留出访问的接口)。
  特点:1.只能通过规定的方法访问数据;2.隐藏类的实例细节,方便修改和实现。
  注:只有getxxx的属性是只读属性,只有setxxx的属性是只写属性
  例:
View Code

package com.imooc.animals;
public class Cat {
    //成员属性:昵称,年龄,体重,品种
    //修改属性的可见性   --private 限定只能在当前类内访问
    private String name;
    int month;
    double weight;
    String species;
    //创建get/set方法
    //在set和get中添加对属性的限制
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return "My name is "+this.name;
    }
    public Cat(){
    }
    //有参构造
    public Cat(String name,int month,double weight,String species){
        this.name=name;
        this.month=month;
        this.weight=weight;
        this.species=species;

    }
    //成员方法
    public void eat(){
        System.out.println("我吃东西了");
    }
    public void run(){
        System.out.println("我跑了");
    }
}

View Code

package com.imooc.animals;

public class Cattest {

    public static void main(String[] args) {
        // 对Cat实例化
        Cat cat=new Cat();
        cat.setName("哈哈");
        String name=cat.getName();
        cat.month=12;
        System.out.println(name);
        System.out.println(cat.month);
        System.out.println(cat.species);
    }
}
``
  Java同一个包下不允许存在同名类(域名倒序+模块+功能)(如com.swpu.chains),域名全部小写,必须放在Java源文件的第一行,建议每个包内存储信息功能单一,一个源文件中只能有一个定义包的语句。
    加载类的顺序跟import导入语句的位置无关【如果有两个包中有同名的类都导入(import com.animals.Cat;import com.animals2.*会优先调用更详细的包路径,与导入的先后位置无关)】;
    “import 包名.*”只能访问指定包名下的类,无法访问子包下的类
四.static关键字
  1.static
    static修饰的成员:静态成员,类成员,无论实例化多少个实例对象,都共享同一块内存空间(和Python的类变量,类方法一致),类对象共享,类加载时产生,销毁时释放,生命周期长。【既可以使用对象名访问,也可以使用类名访问{推荐类名}】
    static+属性-》静态属性,类属性;static+方法-》类方法,静态方法【没有静态类(static+类),也没有(static+方法中的局部变量】
      在成员方法中可以直接访问呢静态成员;
      静态方法中不能直接访问同一个类中的非静态成员【只能通过对象实例化后,对象.成员的方式访问】,只能直接访问同一个类中的静态成员。
  2.代码块:(每一个都是一个作用空间)
    注:同一作用范围不可以定义两个同名的变量,但在不同的代码块中用多个{}相当于多个作用空间,就可以定义相同的变量,作用周期仅仅限制于自己的作用空间。

最外层的{}作用区域包含了代码块1和代码块2
View Code
public void run(){
        {
            System.out.println("我第一");
        }
        System.out.println("我第二");
        {
            System.out.println("我第三");
        }
    }
     构造代码块:(类中{})
      创建对象时调用,优先于构造方法执行(可以有多个,顺序执行),实例化一个对象就执行一次,可以对成员属性,静态属性赋值。
    静态代码块(也是类中static{}:
      类加载时调用,优先于构造代码块执行(可以有多个,顺序执行),无论实例化多少个对象,它都只执行一次,在同一个类中只能直接给静态成员赋值(若要给成员属性赋值,需要实例化对象然后赋值) 
 五.Java封装综合实例
  1.学生类:
View Code
package com.swpu.model;
public class Student {
    // 成员属性 学号,姓名,性别,年龄
    private String studentNum;
    private String studentName;
    private String studentSex;
    private int studentAge;
    // 方案三,对象属性,在没有赋初值前默认为null(关联强度强),传递的是对象的引用
    private Subject studentSubject;

    // 无参构造
    public Student() {
    }
    // 有参构造
    public Student(String studentNum, String studentName, String studentSex, int studentAge) {
        this.setStudentNum(studentNum);
        this.setStudentName(studentName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
    }

    // 方案三构造方法
    public Student(String studentNum, String studentName, String studentSex, int studentAge, Subject subject) {
        this.setStudentNum(studentNum);
        this.setStudentName(studentName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
        this.setStudentSubject(subject);
    }

    public void setStudentNum(String studentNum) {
        this.studentNum = studentNum;
    }

    public String getStudentNum() {
        return this.studentNum;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentSex() {
        return studentSex;
    }

    public void setStudentSex(String studentSex) {
        if (studentSex == "男" || studentSex == "女") {
            this.studentSex = studentSex;
        } else {
            this.studentSex = "男";
        }
    }

    public int getStudentAge() {
        return studentAge;
    }
    /**
     * 专业返回 如果还未实例化(默认为null),实例化后返回
     * @return专业对象
     */
    public Subject getStudentSubject() {

        if(this.studentSubject==null){
            Subject studentSubject=new Subject();
        }
        return studentSubject;
    }

    public void setStudentSubject(Subject studentSubject) {
        this.studentSubject = studentSubject;
    }

    /**
     * 年龄必须z在10到00之间,否则为18
     *
     * @param studentAge
     */
    public void setStudentAge(int studentAge) {
        if (studentAge < 10 || studentAge > 100) {
            this.studentAge = 18;
        } else {
            this.studentAge = studentAge;
        }
    }

    /**
     * 学生自我介绍方法
     *
     * @return 学号,姓名,性别,年龄
     */
    public String introduction() {
        String str = "学生信息如下:\n" + "学生学号:" + this.getStudentNum() + "\n学生姓名:" + this.getStudentName() + "\n学生性别:"
                + this.getStudentSex() + "\n学生年龄:" + this.getStudentAge()+"\n专业名称:"+this.getStudentSubject().getSubjectName()+"\n专业年制:"+this.getStudentSubject().getSubjectLife();
        return str;

    }

    // 连接专业信息和学生
    // 方案一:在函数中添加两个参数表示专业和学制
    //优点:容易理解;缺点:如果需要的信息比较多,参数列表过长,组织麻烦
    /**
     * 学生自我介绍方法重载
     *
     * @param subjectName,subjectLife
     * @param subjectLife
     * @return 学号,姓名,性别,年龄,专业,年限
     */
    public String introduction(String subjectName, int subjectLife) {
        String str = "学生信息如下:\n" + "学生学号:" + this.getStudentNum() + "\n学生姓名:" + this.getStudentName() + "\n学生性别:"
                + this.getStudentSex() + "\n学生年龄:" + this.getStudentAge() + "\n所选专业为:" + subjectName + "\n专业年限为:"
                + subjectLife;
        return str;
    }
    // 方案二:在方法中添加一个专业对象作为参数,通过对象属性获取相应信息
    // 相比更好:可以获取对象的所有属性
    //优点:获取方便;缺点:关联强度不如方法三
    /**
     * 学生自我介绍方法重载
     *
     * @param 专业对象
     * @param subjectLife
     * @return 学号,姓名,性别,年龄,专业,年限
     */
    public String introduction(Subject mysubject) {
        String str = "学生信息如下:\n" + "学生学号:" + this.getStudentNum() + "\n学生姓名:" + this.getStudentName() + "\n学生性别:"
                + this.getStudentSex() + "\n学生年龄:" + this.getStudentAge() + "\n所选专业为:" + mysubject.getSubjectName()
                + "\n专业年限为:" + mysubject.getSubjectLife();
        return str;

    }
    // 方案三:添加专业对象作为属性,通过属性获取相关信息
}

2.专业类:
View Code

package com.swpu.test;

import com.swpu.model.Student;
import com.swpu.model.Subject;

public class SchoolTest {
    public static void main(String[] args) {
        // 测试subject
        Subject subject = new Subject("软件工程", "J10022", 4);
        System.out.println(subject.info());
        System.out.println("**********************************");
        // 学生类测试
        //Student stu1 = new Student("201631062222", "LYQ1", "男", 20);
        //System.out.println(stu1.introduction());
        // 带参学生测试(传入专业和年制)
        System.out.println("**********************************");
        Student stu2 = new Student("201631062232", "LYQ2", "男", 20);
        System.out.println(stu2.introduction("软件工程", 4));
        // 带参学生测试(传入专业对象)
        System.out.println("**********************************");
        Student stu3 = new Student("201631062242", "LYQ3", "女", 20);
        System.out.println(stu3.introduction(subject));
        //将专业对象作为属性
        System.out.println("**********************************");
        Student stu4 = new Student("201631062252", "LYQ4", "女", 18,subject);
        System.out.println(stu4.introduction());
        //指定专业到底有多少人报名
        subject.addStudent(stu2);
        subject.addStudent(stu3);
        subject.addStudent(stu4);
        System.out.println("专业为"+subject.getSubjectName()+"已有"+subject.getStudentNum()+"人数报名");

    }

}

3.测试类:
View Code

package com.swpu.test;

import com.swpu.model.Student;
import com.swpu.model.Subject;

public class SchoolTest {
    public static void main(String[] args) {
        // 测试subject
        Subject subject = new Subject("软件工程", "J10022", 4);
        System.out.println(subject.info());
        System.out.println("**********************************");
        // 学生类测试
        //Student stu1 = new Student("201631062222", "LYQ1", "男", 20);
        //System.out.println(stu1.introduction());
        // 带参学生测试(传入专业和年制)
        System.out.println("**********************************");
        Student stu2 = new Student("201631062232", "LYQ2", "男", 20);
        System.out.println(stu2.introduction("软件工程", 4));
        // 带参学生测试(传入专业对象)
        System.out.println("**********************************");
        Student stu3 = new Student("201631062242", "LYQ3", "女", 20);
        System.out.println(stu3.introduction(subject));
        //将专业对象作为属性
        System.out.println("**********************************");
        Student stu4 = new Student("201631062252", "LYQ4", "女", 18,subject);
        System.out.println(stu4.introduction());
        //指定专业到底有多少人报名
        subject.addStudent(stu2);
        subject.addStudent(stu3);
        subject.addStudent(stu4);
        System.out.println("专业为"+subject.getSubjectName()+"已有"+subject.getStudentNum()+"人数报名");  
    }
}


 



本文地址:https://blog.csdn.net/weixin_49726190/article/details/107682351

相关标签: Java 封装