面向对象基础7(包和封装)

本文介绍了面向对象编程的三大特性之一——封装,强调了隐藏内部实现细节和合理暴露公共接口的重要性。通过访问控制符(private, public, protected, 默认)实现封装,并给出了示例代码展示如何在Java中应用封装。同时,解释了包的作用,即解决同名类冲突,并展示了如何定义和导入包,以及静态导入的概念。最后,文章通过一个User类及其测试类展示了封装的实践应用。
摘要由CSDN通过智能技术生成

面向对象基础7(包和封装)

面向对象三大特征——封装、集成、多态

封装

  1. 隐藏对象的内部实现细节

  2. 将一些公共操作的细节暴露

    ​ 如果通过暴露的界面操作对象,该对象的内部状态不会被破坏

简而言之,封装要求合理的隐藏,合理的暴露。

实现方式——访问控制符

private(类访问权限)——该修饰符修饰的成员,只能在该类中被访问

public(公共)——该修饰符修饰的成员可以在任意地方被访问

protected(子类访问权限)——该修饰符修饰的成员,能在该类,该类所在的包以及子类中被访问

默认——(包访问权限)——该修饰符所修饰的成员,只能在该类以及该类所在的包中被访问

private默认protectedpublic
当前类
当前包
子类
任意

规范

  1. 一般的,成员变量(实例变量)一般用private修饰,为了隐藏实现细节
  2. 为每个成员变量提供gettersetter方法
  3. 需要暴露的公共方法需要用public修饰
  4. 如果希望一个方法主要用于被子类重写,用protected修饰

举例:

package users;

public class User {
    private String name;
    private int age;//此时成员变量name和age已经被封装,用户无法调用或是更改
	//用户名长度要求在6到10个字符之间
    public void setName(String name) {
        if (name.length() > 10 || name.length() < 6) {
            System.out.println("Error" + " " + name);
            return;
        }
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
	//用户年龄要求在18到35岁之间
    public void setAge(int age) {
        if (age > 35 || age < 18) {
            System.out.println("不合需求的廉价劳动力" + " " + age);
            return;
        }
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }
}
import users.User;

public class UserTest {
    public static void main(String[] args) {
        User me = new User();
        me.setName("aa");
        me.setAge(20);
        System.out.println(me.getAge());
        User u = new User();
        System.out.println(me.getName());
        u.setName("gtn2333333");
        u.setAge(2);
        System.out.println(u.getName());
        System.out.println(u.getAge());
    }
}
/*
Error aa
20
null
不合需求的廉价劳动力 2
gtn2333333
0
*/

包(package)

目的——解决同名类冲突问题

包包含所需的类

语法——推荐用公司域名倒写加项目名

定义包之后,其下类完整的类名变为包名.类名

导入包

import用于省略在某一类中调用别的包中的类所需要写的包名(省略写包名)

基本语法:import 包名.类名;——导入该包下的该类,例如import java.util.Scanner;

import 包名.类名.*——导入该包下的所有类,此处的*只能代表类名,包名不能用*

静态导入

import static用于导入指定类下面的所有静态成员(省略写类名)

基本语法:import static 包名.类名.静态成员名导入某包某类的某静态成员

import static 包名.类名.静态成员名导入某包某类的所有静态成员

import static java.lang.System.out;

public class package {
    public static void main(String[] args) {
        out.println("2333");
    }
}

此处导入的就是包(也可以形象的理解为公司)java.lang(language语言的缩写)的System类中的静态成员out,此时调用输出语句时可以省略类名System

Java源程序的结构

package语句要放在第一条

N条import语句

一个public class和若干个class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值