Java基础Day-Six

构造方法

又称构造函数/构造器

构造方法不能被对象单独调用

  • 构造方法与类同名且没有返回值

  • 构造方法的语句格式

    public 构造方法名(){
        //初始化代码
    }
  • 只能在对象实例化的时候调用

  • 当没有指定构造方法时,系统会自动添加无参的构造方法

  • 当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法

  • 一个类中可以有多个构造方法,可带参可无参

this关键字
  • this:当前对象的默认引用

  • 不能在静态方法中使用this关键字

  • this的使用:

    • 调用成员属性,解决成员属性和局部变量同名冲突

    • 调用成员方法

    • 调用重载的构造方法

      • 通过this()调用构造方法必须放在方法体内第一行

Java封装

  • 将类的某些信息隐藏在类内部,不允许外部程序直接访问

  • 通过该类提供的方法来实现对隐藏信息的操作和访问

  • 隐藏对象的信息

  • 留出访问的接口

  • 特点:

    • 只能通过规定的方法访问数据

    • 隐藏类的实例细节,方便修改和实现

封装代码的实现
  • 实现步骤:

    • 修改属性的可见性:设为private(只能在类内被访问)

      private String name;
    • 创建getter/setter方法:设为public用于属性的读写

          //创建get/set方法
          //在get/set方法中添加对属性的限定
          public void setName(String name) {
              this.name=name;
          }
          public String getName() {
              return "我是一只名叫:"+this.name+"的宠物猫";
          }
      package com.imooc.animal;
      ​
      public class CatTest {
          public static void main(String[] args) {
              //对象实例化
              Cat one=new Cat();
              one.setName("花花");
              System.out.println(one.getName());
          }
      }
    • 在getter/setter方法中加入属性控制语句:对属性值的合法性进行判断

  • 只有getXXX方法的属性是只读属性

  • 只有setXXX方法的属性是只写属性

使用包进行类管理
  • 包:

    • 管理Java文件

    • 解决同名文件存储冲突问题

  • 定义包:

    • package 包名;

    • package语句必须放在Java源文件中的第一行

    • 包名全部英文小写

    • 一个Java文件里面只能有一个package语句

    • 包命名:域名倒序+模块+功能(一般域名全部小写)

  • 导入包:

    • import 包名.类名;

    • 导入包中的全部类:import com.imooc.*;

    • 导入包中指定类:import com.imooc.animal.Cat;

  • Java中一个包里不能存在同名类

  • 建议每个包内存储信息功能单一

  • 调用不同包里的同名的类:

    import com.imooc.animal.*;//在当前类当中加载com.imooc.animal下的所有类

    import com.imooc.animal.Cat;//加载指定包下的指定类

    com.imooc.animal.CatTest tex=new com.imooc.animal.CatTest();//直接加载

    • 建议采用”import 包名.类名;“的方式加载,提高效率

    • 加载类的顺序跟import导入语句的位置无关

    • ”import 包名.*; “只能访问指定包名下的类,无法访问子包下的类

  • 常用系统包

    java.lang包含Java语言基础的类,该包系统加载时默认导入,如:System、String、Math
    java.util包含Java语言中常用工具,如:Scanner、Random
    java.io包含输入、输出相关功能的类,如:File、InputStream
static关键字
  • static:静态信息

  • 用static修饰的成员是静态成员,也叫类成员,无论实例化出来多少对象,都会共用同一块内存空间

  • 类对象共享

  • 类加载时产生,销毁时释放,生命周期长

  • 静态成员的两种访问方法:

    • 1、对象.成员

      one.price=2000;
    • 2、类.成员

      Cat.price=3000;
  • static+属性-->静态属性/类属性

  • static+方法-->成员方法/类方法

    • 推荐调用方式:类名.静态成员

  • static不能加在class前面,不能有静态的类

  • static也不能修饰方法内的局部变量

  • 在成员方法中,可以直接访问类中静态成员;

    静态方法中不能直接访问同一个类的非静态成员(包括方法和属性),只能直接调用同一个类中的静态成员

    只能通过对象实例化后,对象.成员方法的方式访问非静态成员

        public static void eat() {
            Cat temp=new Cat();
            temp.run();
            temp.name="小胖";
            System.out.println("小猫吃鱼");
        }

    静态方法中不能使用this

  • 父类中含有static修饰的方法,子类中不能重写

代码块
  • 普通代码块:顺序执行,先出现,先执行

  • 构造代码块:创建对象时调用,优先于构造方法执行

    在每次实例化对象时都会执行一次

    可以给非静态成员属性和静态成员属性赋值

  • 静态代码块:类加载时调用,优先于构造代码块执行

    无论产生实例化对象有多少个,只会在类加载时执行一次

    仅希望执行一次的代码可以放在静态代码块中

    只能直接给静态成员属性赋值,不能给普通成员赋值

    给普通成员赋值需要先对象实例化后,再通过对象.成员给属性赋值

综合案例:学生信息管理
  • Subject.java

package com.imooc.model;
/**
 * 专业类
 * @author zim
 */
public class Subject {
    // 成员属性:学科名称、学科编号、学制年限、报名选修的学生信息、保存报名选修的学生个数
    private String subjectName;
    private String subjectNo;
    private int subjectLife;
    private Student[] myStudents;
    private int studentNum;
​
    // 无参构造方法
    public Subject() {
​
    }
​
    // 带参构造,实现对学科名称、编号、学制年限的赋值
    public Subject(String subjectName, String subjectNo, int subjectLife) {
        this.setSubjectName(subjectName);
        this.setSubjectNo(subjectNo);
        this.setSubjectLife(subjectLife);
    }
    
    // 带参构造,实现对全部属性的赋值
    public Subject(String subjectName, String subjectNo, int subjectLife,Student[] myStudents) {
        this.setSubjectName(subjectName);
        this.setSubjectNo(subjectNo);
        this.setSubjectLife(subjectLife);
        this.setMyStudent(myStudents);
    }
​
    // 为学科名称赋值
    public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
    }
​
    // 读取学科名称
    public String getsubjectName() {
        return subjectName;
    }
​
    // 存储学科编号
    public String getSubjectNo() {
        return subjectNo;
    }
​
    // 读取学科编号
    public void setSubjectNo(String subjectNo) {
        this.subjectNo = subjectNo;
    }
​
    // 读取学制年限
    public int getSubjectLife() {
        return subjectLife;
    }
​
    // 设置学制年限,限制必须>0
    public void setSubjectLife(int subjectLife) {
        if (subjectLife <= 0)
            return;
        else
            this.subjectLife = subjectLife;
    }
​
    /**
     * 获取选修专业的学生信息,如果保存学生信息的数组未被初始化,则先初始化长度200
     * @return 保存学生信息的数组
     */
    public Student[] getMyStudent() {
        if(this.myStudents==null)
            this.myStudents=new Student[200];
        return myStudents;
    }
​
    public void setMyStudent(Student[] myStudents) {
        this.myStudents = myStudents;
    }
​
    public int getStudentNum() {
        return studentNum;
    }
​
    public void setStudentNum(int studentNum) {
        this.studentNum = studentNum;
    }
​
    /**
     * 专业介绍的方法
     * @return 专业介绍的相关信息,包括名称、编号、年限
     */
    public String info() {
        String str = "专业信息如下:\n专业名称:" + this.getsubjectName() + "\n专业编号:" + this.getSubjectNo() + "\n学制年限:"
                + this.getSubjectLife() + "年";
        return str;
    }
    
    public void addStudent(Student stu) {
        /*
         * 1、将学生保存到数组中
         * 2、将学生个数保存到studentNum中
         * */
        // 1、将学生保存到数组中
        for(int i=0;i<this.getMyStudent().length;i++) {
            if(this.getMyStudent()[i]==null) {
                this.getMyStudent()[i]=stu;
                //2、将学生个数保存到studentNum中
                this.studentNum=i+1;
                return;
            }
        }
    }
}
  • SchoolTest.java

package com.imooc.test;
​
import com.imooc.model.Subject;
import com.imooc.model.Student;
​
public class SchoolTest {
​
    public static void main(String[] args) {
        //测试Subject
        Subject sub1=new Subject("计算机科学与技术","J0001",4);
        System.out.println(sub1.info());
        System.out.println("======================");
        //测试Student
        Student stu1=new Student("S01","张三","男",18,sub1);
        System.out.println(stu1.introduction());
        System.out.println("======================");
        Student stu2=new Student("S02","李四","女",17);
        System.out.println(stu2.introduction("计算机科学与技术",4));
        System.out.println("======================");
        Student stu3=new Student("S03","王五","男",18);
        System.out.println(stu3.introduction(sub1));
        System.out.println("======================");
        //测试指定专业中到底有多少学生报名
        sub1.addStudent(stu1);
        sub1.addStudent(stu2);
        sub1.addStudent(stu3);
        System.out.print(sub1.getsubjectName()+"的专业中有"+sub1.getStudentNum()+"人");
    }
}
​
  • Student.java

package com.imooc.model;
​
public class Student {
    // 成员属性:学号、姓名、性别、年龄、专业
    private String studentNo;
    private String studentName;
    private String studentSex;
    private int studentAge;
    private Subject studentSubject;
​
    // 无参构造方法
    public Student() {
​
    }
​
    //多参构造方法,实现对学号、姓名、性别、年龄的赋值
    public Student(String studentNo, String studentName, String studentSex, int studentAge) {
        super();
        this.setStudentNo(studentNo);
        this.setStudentName(studentName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
    }
    
    // 带参构造方法,实现对全部属性的赋值
    public Student(String studentNo, String studentName, String studentSex, int studentAge, Subject studentSubject) {
        super();
        this.setStudentNo(studentNo);
        this.setStudentName(studentName);
        this.setStudentSex(studentSex);
        this.setStudentAge(studentAge);
        this.setStudentSubject(studentSubject);
    }
​
    public String getStudentNo() {
        return studentNo;
    }
​
    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }
​
    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 = "男";
        // 判断方法二:通过equals方法进行字符串内容的判断
        // 如果内容相等返回值为true,反之为false
        // if(str.equals("男"))
        // System.out.println("性别为男");
        // else
        // System.out.println("性别为女");
    }
​
    public int getStudentAge() {
        return studentAge;
    }
​
    /**
     * 给年龄赋值,限定必须在10~100之间,反之赋值为18
     * 
     * @param studentAge 传入年龄
     */
    public void setStudentAge(int studentAge) {
        if (studentAge < 10 || studentAge > 100)
            this.studentAge = 18;
        else
            this.studentAge = studentAge;
    }
​
    /**
     * 获取专业对象, 如果还未实例化,先实例化
     * 
     * @return 专业对象信息
     */
    public Subject getStudentSubject() {
        if (this.studentSubject == null) {
            this.studentSubject = new Subject();
        }
        return studentSubject;
    }
​
    public void setStudentSubject(Subject studentSubject) {
        this.studentSubject = studentSubject;
    }
​
    /**
     * 学生自我介绍的方法
     * 
     * @return 自我介绍的信息,包括姓名、学号、性别、年龄
     */
    public String introduction() {
        String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
                + this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:"
                + this.getStudentSubject().getsubjectName() + "\n学制年限:" + this.getStudentSubject().getSubjectLife();
        return str;
    }
​
    /**
     * 学生自我介绍的方法
     * 
     * @param subjectName 所学专业名称
     * @param subjectLife 学制年限
     * @return 自我介绍的信息,包括姓名、学号、性别、年龄、所学专业名称、学制年限
     */
    public String introduction(String subjectName, int subjectLife) {
        String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
                + this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:" + subjectName + "\n学制年限:"
                + subjectLife;
        return str;
    }
​
    /**
     * 学生自我介绍的方法
     * 
     * @param mySubject 所选专业的对象
     * @return 自我介绍的信息,包括姓名、学号、性别、年龄、所学专业名称、学制年限、专业编号
     */
    public String introduction(Subject mySubject) {
        String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
                + this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:" + mySubject.getsubjectName()
                + "\n学制年限:" + mySubject.getSubjectLife() + "\n专业编号:" + mySubject.getSubjectNo();
        return str;
    }
}
​
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值