构造方法
又称构造函数/构造器
构造方法不能被对象单独调用
-
构造方法与类同名且没有返回值
-
构造方法的语句格式
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; } }