第十一章_访问权限与构造方法

第十一章_访问权限与构造方法


提纲

  • 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关键字

  1. 定义:this代表引用本类的一个对象,在创建类的同时会创建一个this,且只会创建一次,所以这个this是不变的。类似于:创建一个类的对象,比如:Book book = new Book();这里的this相当于这个book对象的引用。
  2. 示例:
    • 代码演示:

        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:张三
      
    • 结论:

      1. 两个Book对象打印结果是一样的地址,证明是同一个Book类的对象。
      2. this对象可以在类里面来引用这个类的属性和方法,也可以作为方法的返回值返回该对象。

11.2 四种访问权限

  • 11.2.1 Java中的权限修饰符:有四种,分别是private(私有的)、缺省的(不写)、protected(受保护的)、public(公共的)。
  • 11.2.2 权限修饰符的作用:控制着对类和类的成员变量以及成员方法的访问。 **注意:**局部变量是不能用权限修饰符修饰的。
  • 11.2.3 四种访问权限的排序与访问范围:
    • 按访问的范围从小到大排列:private < 缺省的 < protected < public
    • private:
      1. **私有的访问权限,本类中可以访问。**如果一个方法或者成员变量被private修饰,那么该变量和方法只在本类中可见,即只能在本类中使用。

      2. 如果其他类想要访问这些方法和属性,则需要设置方法来访问。这样就能够设置一些条件来限制别人的访问,从而保护数据的安全性

      3. 示例:

         //创建一个类
         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
        
    • 缺省的(不写):
      1. **默认的访问权限,同一个包下可以访问。**如果一个方法或者成员变量是默认的访问权限,那么该变量和方法只在同一个包中可见,即只能在本包中使用。

      2. 示例:

         //在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 什么是构造方法:构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。

  • 构造方法的特点:

    1. 没有返回值,与返回值无关(**注意:**这里的没有返回值是不写,而不是void)。
    2. 与类同名。
    3. 每次创建(实例化)这个类的对象时就会调用一次。
    4. 如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的构造方法。
    5. 如果类中定义的所有构造方法都不是无参的构造方法,那么编译器是不会为类设置一个默认空的构造方法的。
    6. **作用:**可以对参数进行初始化。
  • 11.3.2 基本语法:

      访问权限 class 类名{
      	//空的构造方法
      	访问权限 类名(){
    
      	}
      }
    
  • 11.3.3 示例:

    1. 例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. 例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. 例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 对象数组

  1. 什么是对象数组:将一个类的多个对象存储在数之中。这些对象包含有这个类的属性与自身的属性值。

  2. 创建对象数组语法(与创建基本类型与String类型数组一样):

     类名[] 创建的数组对象名 = new 类名[长度];
    
  3. 例:

     //对象数组 里面存的是创建数组类的对象 默认值是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 访问权限作业

    1. 将你自己的信息封装成一个类Student,包括姓名name,性别sex,年龄age,家庭地址address。并在display()方法中显示这些信息。

    2. 编写一个长方体(Box)类。Box类中包含长(length),宽(width),高(height)三个属性。1、三个属性私有。2、提供三个setXXX()方法设置三个属性的值。3、提供三个getXXX()方法返回三个属性的值。4、提供computeArea()方法计算并返回长方体的表面积,computeVolume()方法计算并返回长方体的体积。5、在display()方法中显示长方体的特征(长,宽,高,表面积和体积)。6、编写一个测试类TestBox测试上面的方法。

    3. 猜数字游戏:一个类A有一个成员变量v,有一个初值100。定义一个类,对A类的成员变量v进行猜。如果大了则提示大了,小了则提示小了。等于则提示猜测成功。

    4. 请定义一个交通工具(Vehicle)的类,其中有:属性:速度(speed),体积(size)等等。方法:移动(move()),设置速度(setSpeed(int speed)),加速speedUp(),减速speedDown()等等.最后在测试类VehicleTest中的main()中实例化一个交通工具对象,并通过方法给它初始化speed,size的值,并且打印出来。另外,调用加速,减速的方法对速度进行改变。

    5. 定义一个方法传一个参数,根据这个参数可以输出以下加法表:如传入5

       0 + 5 = 5
       1 + 4 = 5
       2 + 3 = 5
       3 + 2 = 5
       4 + 1 = 5
       5 + 0 = 5
      
    6. 定义一个考试类StuTest,定义三个私有的变量chinese、math、english分别表示语数外成绩,定义三个成绩的对应get、set方法,定义一个sum()方法,显示总分,定义Test类进行测试。

    7. 定义Compute类,其中,有私有属性:长方形的长和宽,三角形的底和高,圆形的半径。其中三个方法分别计算长方形、三角形和圆的面积,用户输入数值,当数值为1时计算长方形面积,为2时计算三角形面积,为3时计算圆面积。

  • 11.5.2 构造方法作业:学生类 属性 名字 性别 年龄

    1. 提供构造方法 给名字 性别 年龄赋值
    2. 提供构造方法 给名字赋值
    3. 提供构造方法 不做任何赋值操作
  • 11.5.3 思考题

    1. 使用面向对象思想编写划拳游戏。

    2. 使用面向对象实现双色球系统。

    3. 使用面向对象和对象数组思想编写寝室管理系统,
      要求:写一个学生类Student,类中有属性:姓名name,年龄age,java成绩JavaScore,html成绩htmlScore,sql成绩sqlScore。
      类中有方法:1、自我介绍方法display()。
      2、得到当前学生每门功课的总分的方法(无参有返回)getSum()。
      3、得到当前学生平均分的方法(无参有返回)getAvg()。
      要求实现如下功能:

       		寝室学生管理系统		    
       		修改
       		删除
       		添加
       		查询
       		显示
       	
       		退出
      
    4. 使用面向对象和对象数组思想编写寝室管理系统,
      要求:写一个学生类Student,类中有属性:姓名name,年龄age,java成绩JavaScore,html成绩htmlScore,sql成绩sqlScore。
      类中有方法:1、自我介绍方法display()。
      2、得到当前学生每门功课的总分的方法(无参有返回)getSum()。
      3、得到当前学生平均分的方法(无参有返回)getAvg()。
      要求实现如下功能:

       		寝室学生管理系统		    
       		修改
       		删除
       		添加
       		查询
       		显示
       	
       		退出
      
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值