Java入门姿势【面向对象6】三大特性之一封装性

上次我为大家写出啦“package和import”包的导入和使用,导包是Java学习最基础操作,如没有了解透彻的话请打开下方文章在进行观看一下哦!!今天的话就要做好认真看一下咯,我们来说一下面向对象三大特性之“封装”。

Java入门姿势【面向对象5】 package和import

学习教程推荐:

封装性

封装(encapsulation)是面向对象三大特征之一。对于程序合理的封装让外部调用更加方便,更加利于写作。同时,对于实现者来说也更加容易修正和改版代码。我们今天就来啃它~

1、引入封装概念

我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?或者有必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。同理,汽车暴露离合、油门、制动和方向盘,驾驶员不需要懂原理和维修也可以驾驶。

需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。在说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

我们程序设计要追求“高内聚,低耦合”。 高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;|
低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。

编程中封装的具体优点:

  • 提高代码的安全性。
  • 提高代码的复用性。
  • “高内聚”:封装细节,便于修改内部代码,提高可维护性。
  • “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

未进行封装的代码演示:

class Person {
	String name;
	int age;
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
public class Test {
	public static void main(String[ ] args) {
		Person p = new Person();
		p.name = "小红";
		p.age = -45;//年龄可以通过这种方式随意赋值,没有任何限制
		System.out.println(p);
	}
}

通过上方代码我们可以看到,年龄不可能是负数,也不可能超过130岁,但是如果没有使用封装的话,便可以给年龄赋值成任意的整数,这显然不符合我们的正常逻辑思维。那么如何使用正常的逻辑来编写呐?嘿~~嘿 ~~先放一下,来说下一个知识点。

2、权限修饰符

Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为private、默认、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。

下面详细讲述它们的访问权限问题。其访问权限范围如表所示:

1. private: 表示私有,只有自己类能访问

2. default:表示没有修饰符修饰,只有同一个包的类能访问

3. protected:表示可以被同一个包的类以及其他包中的子类访问

4. public:表示可以被该项目的所有包中的所有类访问

类的成员的处理:

  • 一般使用private访问权限。
  • 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。
  • 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

类的处理:

  • 类只能使用public和默认来修饰
  • 默认:当前包
  • public:当前项目的所有包
  • public类要求类名和文件名相同,一个java文件中至多一个public类

接下来让我们看一下,封装后的代码演示:

class Person {
	private String name;
	private int age;
	public Person() {
	}
	public Person(String name, int age) {
		this.name = name;
		setAge(age);
	}	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		//在赋值之前先判断年龄是否合法
		if (age > 130 || age < 0) {
			this.age = 18;//不合法赋默认值18
		} else {
			this.age = age;//合法才能赋值给属性age
		}
	}
	public int getAge() {
		return age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

public class Test2 {
	public static void main(String[ ] args) {
		Person p1 = new Person();
		//p1.name = "小红"; //编译错误
		//p1.age = -45;  //编译错误
		p1.setName("小红");
		p1.setAge(-45);
		System.out.println(p1);		
		Person p2 = new Person("小白", 300);
		System.out.println(p2);
	}
}

从上面我们可以看到,Java未封装的代码显得是多么柔弱无力~大家可以编写一下试试。

3、封装练习

我们以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出版社名,价格;方法包括:信息介绍,来练习一下封装;

要求:

1) 设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问
2) 限定价格必须大于10,如果无效进行提示
3) 设计构造方法实现对属性赋值
4) 信息介绍方法描述图书所有信息
5) 编写测试类,测试图书类的对象及相关方法(测试数据信息自定)

写好啦没  没有的话,我这已经写好啦:“对Book进行封装”:

代码演示:

public class Book {
    private  String bookName;//书名
    private String author;//作者
    private String publisher;//出版社
    private double price;//
    public Book(){
        //super();
    }
    public Book(String bookName,String author,String publisher,double price){
        this.bookName = bookName;
        this.author = author;
        this.publisher = publisher;
        //this.price = price;
        this.setPrice(price);
    }
    public void setBookName(String bookName){
        this.bookName = bookName;
    }
    public String getBookName(){
        return this.bookName;
    }
    public void setAuthor(String author){
        this.author = author;
    }
    public String getAuthor(){
        return author;
    }
    public String getPublisher(){
        return publisher;
    }
    public void setPublisher(String publisher){
        this.publisher = publisher;
    }
    public void setPrice(double price){
        if(price < 15){
            this.price = 10;
            System.out.println("价格必须大于10元,默认10元");
        }else{
            this.price = price;
        }
    }
    public double getPrice(){
        return this.price;
    }
    public void show(){
        System.out.println("bookName="+bookName+",author="
                +author+",price="+price+",publisher="+publisher);
    }
    public static void main(String[] args) {
        //购买第一本书
        Book book1 = new Book();
        //book1.price = 3;
        book1.setBookName("鹿鼎记");
        book1.setAuthor("金庸");
        book1.setPrice(7);
        book1.setPublisher("清华大学出版社");
        book1.show();
        //购买第二本书
        Book book2 =
                new Book("倚天屠龙记","金庸","清华大学出版社",30);
        book2.show();
        System.out.println(book1.getBookName());
    }
}

嘿~嘿~~感兴趣的同学快去试一下去~~

以上就是本章节所讲述的全部内容啦,稍后我在更新后续哦,喜欢的伙伴支持一下哦~

感谢观看~

 

おすすめ

転載: blog.csdn.net/LSFZ88888/article/details/119956569