第十一章_访问权限与构造方法
提纲
- 11.1 this关键字
- 11.2 Java中的四种访问权限
- 11.2.1 Java中的权限修饰符
- 11.2.2 权限修饰符的作用
- 11.2.3 四种访问权限的排序与访问范围
- 11.2.4 类的访问权限
- 11.2.5 快速打出getter、setter方法的快捷键
- 11.3 类的构造方法
- 11.3.1 什么是构造方法
- 11.3.2 基本语法
- 11.2.3 示例
- 11.3.4 快速创建构造方法快捷键
- 11.4 对象数组
- 11.5 作业
- 11.5.1 访问权限作业
- 11.5.2 构造方法作业
- 11.5.3 思考题
11.1 this关键字
- 定义:this代表引用本类的一个对象,在创建类的同时会创建一个this,且只会创建一次,所以这个this是不变的。类似于:创建一个类的对象,比如:Book book = new Book();这里的this相当于这个book对象的引用。
- 示例:
-
代码演示:
public class Book { private String name; public Book getBook1(){ return this; } /** * 还能返回一个数组 */ public int[] getIntArr(){ int[] intArr = {1,2,3}; return intArr; } public Book getBook2(){ return this; } public void getName(String name){ System.out.println("this.name:"+this.name); System.out.println("name:"+name); } public static void main(String[] args) { Book book = new Book(); System.out.println(book.getBook1()); System.out.println(book.getBook2()); book.getName("张三"); } } //执行结果: com.zxjy.Book@c3c749 com.zxjy.Book@c3c749 this.name:尼古拉斯 name:张三
-
结论:
- 两个Book对象打印结果是一样的地址,证明是同一个Book类的对象。
- this对象可以在类里面来引用这个类的属性和方法,也可以作为方法的返回值返回该对象。
-
11.2 四种访问权限
- 11.2.1 Java中的权限修饰符:有四种,分别是private(私有的)、缺省的(不写)、protected(受保护的)、public(公共的)。
- 11.2.2 权限修饰符的作用:控制着对类和类的成员变量以及成员方法的访问。 **注意:**局部变量是不能用权限修饰符修饰的。
- 11.2.3 四种访问权限的排序与访问范围:
- 按访问的范围从小到大排列:private < 缺省的 < protected < public
- private:
-
**私有的访问权限,本类中可以访问。**如果一个方法或者成员变量被private修饰,那么该变量和方法只在本类中可见,即只能在本类中使用。
-
如果其他类想要访问这些方法和属性,则需要设置方法来访问。这样就能够设置一些条件来限制别人的访问,从而保护数据的安全性。
-
示例:
//创建一个类 public class Book { //私有的属性姓名 private String name; //私有属性年龄 private int age; public String getName(){ return this.name; } public void setName(String name){ //this.name为本类中的name,而等号后面的name为参数name this.name = name; } public int getAge(){ return this.age; } //通过条件来限制年龄的设置 public void setAge(int age){ if (age > 150 || age < 0) { System.out.println("年龄设置无效!"); this.age = 0; } else { this.age = age; } } } //创建一个测试类 public class Test { public static void main(String[] args) { Book book = new Book(); //错误,因为name为私有属性,无法直接访问 //book.name; //正确获取name的值 String name = book.getName(); //设置name的值 book.setName("海底两万里"); //设置年龄超过200,无效年龄,无法修改数据 book.setAge(200); System.out.println(book.getAge()); } } //执行结果: 年龄设置无效! age=0
-
- 缺省的(不写):
-
**默认的访问权限,同一个包下可以访问。**如果一个方法或者成员变量是默认的访问权限,那么该变量和方法只在同一个包中可见,即只能在本包中使用。
-
示例:
//在com.zxjy包下有一个公共Person类,类中有默认访问权限的属性name和age package com.zxjy; public class Person { String name; int age; } //在com.zxjy包下有一个默认访问权限的Book类 package com.zxjy; class Book { } //在com.zxjy.test包下有一个测试类 package com.zxjy.test; import com.zxjy.Person; public class Test { public static void main(String[] args) { Person person = new Person(); //由于name和age属性是默认访问权限,且现在是跨包访问,所以无法点出其属性 person. //无法创建对象 Book book = new Book(); } }
-
- protected:受保护的访问权限。同包且子类可以访问。(在继承章节详讲)
- public:公共的访问权限,所有类都可以访问。
- 11.2.4 类的访问权限:只有两种:public和默认的。写private与protected编译器会报错误。
- 11.2.5 快速打出getter、setter方法的快捷键:alt+shift+s,然后选择generate getters and setters,再选择私有属性前面打勾。右边,从上往下依次是:全选、反选、全部只选get方法、全部只选set方法。
11.3 类的构造方法
-
11.3.1 什么是构造方法:构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。
-
构造方法的特点:
- 没有返回值,与返回值无关(**注意:**这里的没有返回值是不写,而不是void)。
- 与类同名。
- 每次创建(实例化)这个类的对象时就会调用一次。
- 如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的构造方法。
- 如果类中定义的所有构造方法都不是无参的构造方法,那么编译器是不会为类设置一个默认空的构造方法的。
- **作用:**可以对参数进行初始化。
-
11.3.2 基本语法:
访问权限 class 类名{ //空的构造方法 访问权限 类名(){ } }
-
11.3.3 示例:
-
例1:定义一个空的构造方法并测试构造方法的作用。(没有参数的构造方法称为空的构造方法)
//创建一个Book类 public class Book{ //类中有一个空的构造方法 public Book(){ System.out.println("空的构造方法被调用了"); } } //创建一个测试类 public class Test { public static void main(String[] args) { Book book1 = new Book(); Book book2 = new Book(); } } //执行结果: 空的构造方法被调用了 空的构造方法被调用了
-
例2: 设置一个带参数的构造方法,并对类中的属性进行初始化。
//创建一个Book类 public class Book{ String name; int age; //带参数的构造方法 public Book(String name, int id){ this.name = name; this.id = id; } public void display(){ System.out.println("name="+name+",id="+id); } } //创建一个测试类 public class Test { public static void main(String[] args) { //这样会报错,因为类中只有带参数的构造方法。 //Book book1 = new Book(); //创建对象的时候传入参数初始化属性 Book book2 = new Book("钢铁是怎样炼成的", 188); //调用显示属性的方法 book2.display(); } } //执行结果: name=钢铁是怎样炼成的,id=188
-
例3:构造方法的访问权限对创建对象的影响。
public class Book{ private Book(){ System.out.println("空的构造方法被调用了"); } } //当访问权限为private时:其他所有类都不能创建无参的对象。 //当访问权限为默认时,同包可以访问。
结论:构造方法受访问权限的限制。
-
-
11.3.4 快速创建构造方法快捷键:
- 创建空的构造方法:alt+shift+s,然后选择generate constructors from superclass,然后ok。删掉里面的super();和另外一个注释。
- 创建带参数的构造方法:alt+shift+s,然后选择generate constructor using fields,然后全部选中,ok。删掉里面的super();和另外一个注释。
11.4 对象数组
-
什么是对象数组:将一个类的多个对象存储在数之中。这些对象包含有这个类的属性与自身的属性值。
-
创建对象数组语法(与创建基本类型与String类型数组一样):
类名[] 创建的数组对象名 = new 类名[长度];
-
例:
//对象数组 里面存的是创建数组类的对象 默认值是null Student[] student = new Student[3]; //循环打印数组信息 for (int i = 0; i < student.length; i++) { System.out.println(student[i]); } //创建三个学生,并赋予初始值 Student s1 = new Student(); s1.age = 11; s1.name = "刘德华"; s1.sex = "男"; Student s2 = new Student(); s2.age = 18; s2.name = "波多野结衣"; s2.sex = "女"; Student s3 = new Student(); s3.age = 21; s3.name = "吉泽明步"; s3.sex = "女"; //将三名学生分别存入数组中 student[0] = s1; student[1] = s2; student[2] = s3; //循环打印数组信息 for (int i = 0; i < student.length; i++) { System.out.println((i+1)+"号学生姓名:"+student[i].name+",年龄"+student[i].age+",性别"+student[i].sex);//student[0] = s1;数组的每一个位置都是一个学生对象,所以得到这个对象之后便可以点出其中的属性 } //执行结果: null null null 1号学生姓名:刘德华,年龄11,性别男 2号学生姓名:波多野结衣,年龄18,性别女 3号学生姓名:吉泽明步,年龄21,性别女
11.5 作业
-
11.5.1 访问权限作业
-
将你自己的信息封装成一个类Student,包括姓名name,性别sex,年龄age,家庭地址address。并在display()方法中显示这些信息。
-
编写一个长方体(Box)类。Box类中包含长(length),宽(width),高(height)三个属性。1、三个属性私有。2、提供三个setXXX()方法设置三个属性的值。3、提供三个getXXX()方法返回三个属性的值。4、提供computeArea()方法计算并返回长方体的表面积,computeVolume()方法计算并返回长方体的体积。5、在display()方法中显示长方体的特征(长,宽,高,表面积和体积)。6、编写一个测试类TestBox测试上面的方法。
-
猜数字游戏:一个类A有一个成员变量v,有一个初值100。定义一个类,对A类的成员变量v进行猜。如果大了则提示大了,小了则提示小了。等于则提示猜测成功。
-
请定义一个交通工具(Vehicle)的类,其中有:属性:速度(speed),体积(size)等等。方法:移动(move()),设置速度(setSpeed(int speed)),加速speedUp(),减速speedDown()等等.最后在测试类VehicleTest中的main()中实例化一个交通工具对象,并通过方法给它初始化speed,size的值,并且打印出来。另外,调用加速,减速的方法对速度进行改变。
-
定义一个方法传一个参数,根据这个参数可以输出以下加法表:如传入5
0 + 5 = 5 1 + 4 = 5 2 + 3 = 5 3 + 2 = 5 4 + 1 = 5 5 + 0 = 5
-
定义一个考试类StuTest,定义三个私有的变量chinese、math、english分别表示语数外成绩,定义三个成绩的对应get、set方法,定义一个sum()方法,显示总分,定义Test类进行测试。
-
定义Compute类,其中,有私有属性:长方形的长和宽,三角形的底和高,圆形的半径。其中三个方法分别计算长方形、三角形和圆的面积,用户输入数值,当数值为1时计算长方形面积,为2时计算三角形面积,为3时计算圆面积。
-
-
11.5.2 构造方法作业:学生类 属性 名字 性别 年龄
- 提供构造方法 给名字 性别 年龄赋值
- 提供构造方法 给名字赋值
- 提供构造方法 不做任何赋值操作
-
11.5.3 思考题
-
使用面向对象思想编写划拳游戏。
-
使用面向对象实现双色球系统。
-
使用面向对象和对象数组思想编写寝室管理系统,
要求:写一个学生类Student,类中有属性:姓名name,年龄age,java成绩JavaScore,html成绩htmlScore,sql成绩sqlScore。
类中有方法:1、自我介绍方法display()。
2、得到当前学生每门功课的总分的方法(无参有返回)getSum()。
3、得到当前学生平均分的方法(无参有返回)getAvg()。
要求实现如下功能:寝室学生管理系统 修改 删除 添加 查询 显示 退出
-
使用面向对象和对象数组思想编写寝室管理系统,
要求:写一个学生类Student,类中有属性:姓名name,年龄age,java成绩JavaScore,html成绩htmlScore,sql成绩sqlScore。
类中有方法:1、自我介绍方法display()。
2、得到当前学生每门功课的总分的方法(无参有返回)getSum()。
3、得到当前学生平均分的方法(无参有返回)getAvg()。
要求实现如下功能:寝室学生管理系统 修改 删除 添加 查询 显示 退出
-