Java基础:17 面向对象特征(1)——封装

本文详细介绍了Java中的封装特性,包括封装的作用、包的管理、访问权限修饰符的使用、信息隐藏的重要性、构造方法的功能、关键字this的含义以及JavaBean规范。封装是面向对象编程的基础,它通过隐藏类的内部实现细节,提供简洁的公共接口,以提高代码的可维护性和可扩展性。文章还讲解了如何通过包和访问权限控制来实现信息隐藏,并举例说明了构造器和this关键字的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、封装的作用和含义

我们程序设计追求“高内聚,低耦合”。

  • 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合 :仅对外暴露少量的方法用于使用。

封装就是用来达成这种目的的。
封装性的设计思想:隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露 的暴露出来。

2、包

(1)包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次。
(2)作用:为了将我们类进行分目录管理。
(3)包的命名规则:

  • 包名所有的字母都小写
  • 包名采用公司域名的逆序

(4)语法格式

package 顶层包名.子包名

(5)JDK中主要的包介绍

  1. java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和 Thread,提供常用功能
  2. java.net----包含执行与网络相关的操作的类和接口。
  3. java.io ----包含能提供多种输入/输出功能的类。
  4. java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日 期日历相关的函数。
  5. java.text----包含了一些java格式化相关的类
  6. java.sql----包含了java进行JDBC数据库编程的相关类/接口
  7. java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这 些类被用来构建和管理应用程序的图形用户界面(GUI)。

(6)导包–import
import语句告诉编译器到哪里去寻找类,来引入指定包层次下所需要的类或全部类(.*)。
语法格式:

import 包名.类名;

注意事项:

  1. 在源文件中使用import显式的导入指定包下的类或接口。
  2. 声明在包的声明和类的声明之间。
  3. 如果需要导入多个类或接口,那么就并列显式多个import语句即可。
  4. 可以一次性引入指定包层次下所需要的全部类或接口(.*)。 例如:import java.util.*;//一次性导入util包下所有的类或接口
  5. 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
  6. 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
  7. 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
  8. import static组合的使用:调用指定类或接口下的静态的属性或方法。

3、访问权限修饰符

Java权限修饰符public、protected、(缺省)、private置于类的成员定义前, 用来限定对象对该类成员的访问权限。
在这里插入图片描述
对于class的权限修饰只可以用public和default(缺省)。

  • public类可以在任意地方被访问。
  • default类只可以被同一个包内部的类访问。

4、信息隐藏

(1)使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题,应该将属性保护起来, 防止乱用。
保护的方式:信息隐藏

(2)Java中通过将数据声明为私有的(private),再提供公共的(public) 方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑, 限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性。

(3)例子
改前:

class Animal { 
    public int legs;  
} 
    public class Zoo { 
    public static void main(String args[]) { 
        Animal xb = new Animal(); 
        xb.legs = 4; 
        System.out.println(xb.legs); 
        xb.eat(); 
        xb.move(); 
    } 
}

改后:

class Animal { 
    private int legs;// 将属性legs定义为private,只能被Animal类内部访问 
    public void setLegs(int i) { // 在这里定义方法 eat() 和 move() 
        if (i != 0 && i != 2 && i != 4) { 
            System.out.println("Wrong number of legs!"); 
            return; 
        } 
        legs = i; 
    } 
    public int getLegs() { 
        return legs; 
    } 
} 
public class Zoo { 
    public static void main(String args[]) { 
        Animal xb = new Animal(); 
        xb.setLegs(4); // xb.setLegs(-1000); //xb.legs = -1000; // 非法 
        System.out.println(xb.getLegs()); 
    } 
}

5、构造方法 / 构造器

(1)特征

  • 它具有与类相同的名称
  • 它不声明返回值类型。(与声明为void不同)
  • 不能被static、final、synchronized、abstract、native修饰,不能有 return语句返回值

(2)构造方法的作用:

  1. 创建对象
  2. 完成对象的初始化(为成员属性赋值)
  3. 为成员属性设置默认值

(3)语法格式

修饰符 类名 (参数列表) { 
     初始化语句; 
}

(4)分类
根据参数不同,构造器可以分为如下两类:

  • 隐式无参构造器(系统默认提供)
  • 显式定义一个或多个构造器(无参、有参)

注 意:

  • Java语言中,每个类都至少有一个构造器,默认提供一个无参构造器
  • 默认构造器的修饰符与所属类的修饰符一致
  • 一旦显式定义了构造器,则系统不再提供默认构造器
  • 一个类可以创建多个重载的构造器,父类的构造器不可被子类继承
public Person() {
		System.out.println("构造方法执行");
}
public Person(String n) {
	name = n;
}
public Person(int a) {
	age = a;
}
public Person(String n ,int a) {
	name = n;
	age =a;
}

6、关键字this

this:表示当前对象

  • this可用于区分同名的成员变量和局部变量
  • this可以调用本类的其他的重载的构造方法。在构造方法中使用this调用其他构造方法,必须位于该构造方法的第一句,故this调用构造方法只能调用一次。
  • this也可以用于setter()和getter()方法中。
  • 使用this访问属性和方法时, 如果在本类中未找到,会从父类中查找
public Person() {
	System.out.println("构造方法执行");
}
public Person(String name) {
	this.name = name;
	System.out.println(name);
}
public Person(int age) {
	this.age = age;
}
public Person(String name ,int age) {
	this(name);
	this.age = 18;
}

7、JavaBean

JavaBean是一种Java语言写成的可重用组件。 所谓javaBean,是指符合如下标准的Java类:

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get、set方法
//类是公共的
public class Student {
	//成员属性
	private String stuNo;
	private String stuName;
	private int stuAge;
	
	//构造器
	//1 先写无参
	public Student() {
		
	}
	//有参构造若干
	public Student(String stuName,int stuAge) {
		this.stuName = stuName;
		this.stuAge = stuAge;
	}
	public Student(String stuNo,String stuName,int stuAge) {
		this(stuName,stuAge);
		this.stuNo = stuNo;
	}
	//对应的get、set方法
	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuNo() {
		return this.stuNo;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public String getStuName() {
		return this.stuName;
	}
	public void setStuAge(int stuAge) {
		this.stuAge = stuAge;
	}
	public int getStuAge() {
		return this.stuAge;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值