Java类和对象之访问限制


任务描述

本关任务:实现图书类,该类包含了图书的基本属性和信息。

相关知识

为了完成本关任务,你需要掌握:Java 访问控制修饰符的使用。

Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

访问控制符是一组限定类、属性或方法是否可以被程序里的其他部分访问和调用的修饰符。类的访问控制符只能是空或者 public,方法和属性的访问控制符有 4 个,分别是 public、 private、protected 和 default,其中 default 是一种没有定义专门的访问控制符的默认情况。

我们可以通过下表来说明访问权限:

修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/N(说明)N
defaultYYYNN
privateYNNNN

访问控制存在的原因:

  1. 让客户端程序员无法触及他们不应该触及的部分;
  2. 允许库设计者改变类内部的工作方式而不用担心会影响到客户端程序员。
default

如果一个类没有访问控制符,说明它具有默认的访问控制特性。这种默认的访问控制权规定,该类只能被同一个包中的类访问和引用,而不能被其他包中的类使用。

例如:

Demo 类现在使用的是默认控制符,并且它在 com.test 包中。

package com.testclass  Demo {
    
}

Person 类也处于 com.test 包中。

package com.test
import com.test.Demo;
class  Person {   
    Demo d;
}

上面的这两个类都处于同一个包中,它们被默认控制符所修饰,所以两个类可以相互访问。而假如 Demo 类处于 com 包中,则它们就不能互相访问。

public

共有的,是访问权限限制最宽的修饰符。被 public 修饰的类、属性、及方法不仅可以跨类访问,而且可以跨包访问。 例如:

public static void main(String[] args) {
    
}

我们之前所定义的主方法不管在哪个类中,哪个包中,都可以被访问。

private

用 private 修饰的类成员、属性以及方法只能被该类的对象访问,而不能被任何其他类(包括该类的子类)访问和引用。因此,private 修饰符具有最高的保护级别。声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问。

例如:

public class Person {  
    private String name;  
    private int age;   
    public String getName() {    
        return name;    
        }  
    public void setName(String name) {    
        this.name = name;   
         }  
    public int getAge() {    
        return age;    
        }   
    public void setAge(int age) {       
     this.age = age;   
    }
}

实例中,Person 类中的 age 和 name 变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,定义了两个变量的 get 和 set 方法,用来获取变量的值和设置变量的值。

public class  Demo {    
    public static void main(String[] args) {  
        Person person = new Person();     
        person.setAge(18);      
        person.setName("张三");       
        System.out.printf("我的名字叫%s,今年%d岁",person.getName(),person.getAge());  
    }
}

执行结果:

我的名字叫张三,今年18岁
protected

用保护访问控制符 protected 修饰的类成员可以被三种类所访问:该类自身、与它在同一个包中的其他类以及在其他包中的该类的子类。protected 修饰符的主要作用,是允许其他包中它的子类来访问父类的特定属性和方法,否则可以使用默认访问控制符。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。


实践作业代码

开始你的任务吧,祝你成功!

/**
 * 任务:实现图书类,该类包含了图书的基本属性和信息。
 * 类名为:Book
 */

// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
public class Book {
    // 定义四个私有变量
    // 图书名称(bookName String)
    // 图书单价(price double)
    // 图书库存(total int)
    // 图书id(bookId int)
	private String bookName;
	private double price;
	private int total;
	private int bookId;

    // 获取图书名称
    public String getBookName() {
    	return bookName;
    }
    // 设置图书名称
    public void setBookName(String bookName) {
    	this.bookName=bookName;
    }
    // 获取图书单价
    public double getPrice() {
    	return price;
    }
    // 设置图书单价
    public void setPrice(double price) {
    	this.price=price;
    }
    // 获取图书库存
    public int getTotal() {
    	return total;
    }
    // 设置图书库存
    public void setTotal(int total) {
    	this.total=total;
    }
    // 获取图书id
    public int getBookId() {
    	return bookId;
    }
    // 设置图书id
    public void setBookId(int bookId) {
    	this.bookId=bookId;
    }
    
    //以下代码不写也能过判题系统
    public static void main(String []args) {
    	Book book =new Book();
    	book.setBookId(1);
    	book.setBookName("神雕侠侣");
    	book.setPrice(32.00);
    	book.setTotal(35941);
    	System.out.println("图书编号:"+book.getBookId());
    	System.out.println("图书名称:"+book.getBookName());
    	System.out.printf("图书单价:%.2f",book.getPrice());
    	System.out.println();
    	System.out.println("图书库存:"+book.getTotal());
    }
}
/********** End **********/


任务描述

本关任务:实现一个电影类。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。


/**
 * 任务:实现一个电影类
 * 类名为:Movie
 */

// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/


public class Movie {
    // 定义6个变量
    // 电影id(id int) 电影名称(movieName String)  电影类型(movieType String)
    // 电影评分(double score)  电影时长(totalTime int)  电影简介(content String)
	private int id;
	private String movieName;
	private String movieType;
	private double score;
	private int totalTime;
	private String content;
	

    // 定义设置和获取6个变量值的方法
	public void setId(int id) {
		this.id=id;
	}
	public int getId() {
		return id;
	}
	public void setMovieName(String movieName) {
		this.movieName=movieName;
	}
	public String getMovieName() {
		return movieName;
	}
	public void setMovieType(String movieType) {
		this.movieType=movieType;
	}
	public String getMovieType() {
		return movieType;
	}
	public void setScore(double score) {
		this.score=score;
	}
	public double getScore() {
		return score;
	}
	public void setTotalTime(int totalTime) {
		this.totalTime=totalTime;
	}
	public int getTotalTime() {
		return totalTime;
	}
	public void setContent(String content) {
		this.content=content;
	}
	public String getContent() {
		return content;
	}
	
	
	//以下代码其实不写也能过判题系统
	public static void main(String []args) {
		Movie movie =new Movie();
		movie.setId(1);
		movie.setMovieName("流浪地球");
		movie.setMovieType("科幻");
		movie.setScore(7.90);
		movie.setTotalTime(125);
		movie.setContent("近未来,科学家们发现太阳急速衰老膨胀,短时间内包括地球在内...");
		System.out.println("电影id:"+movie.getId());
		System.out.println("电影名称:"+movie.getMovieName());
		System.out.println("电影类型:"+movie.getMovieType());
		System.out.printf("电影评分:%.2f",movie.getScore());
		System.out.println();
		System.out.println("电影时长:"+movie.getTotalTime());
		System.out.println("电影简介:"+movie.getContent());
	}
}
/********** End **********/

开始你的任务吧,祝你成功!

电影id:1

电影名称:流浪地球

电影类型:科幻

电影评分:7.90

电影时长:125

电影简介:近未来,科学家们发现太阳急速衰老膨胀,短时间内包括地球在内…

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐