Java类和对象封装

  1. 面向对象程序三大特性:封装、继承、多态。
  2. 在类和对象阶段,主要研究:封装。
  3. 什么是封装?——套壳屏蔽细节
    eg. 电脑提供给用户的是:开关机、通过键盘输入,显示器,usb插孔等等,让用户和计算机进行交互完成日常事务。但是实际上,电脑真正工作的是CPU、显卡、内存等一些硬件软件。
    对于用户而言,不用关系计算机的内部核心结果,只要知道怎么开关机、怎么通过键盘和鼠标与计算机进行交互就可以。
    因此,计算机在出厂时,厂商在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标等,使用户可以和计算机进行交互即可。
  4. 封装:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。【把类的实现细节进行隐藏,对外只提供交互的接口】
  5. Java访问修饰限定符【4类:private、default默认权限、protected、public】
    Java中主要通过访问权限实现封装可以将数据和封装数据的方法结合在一起,访问权限可以控制方法或者字段能否直接在类外使用。
  6. 封装扩展——包
    什么是包?为了更好的管理类,把多个类收集在一起成为一组,称为软件
    eg. 为了更好的管理歌曲,可以将相同属性的歌曲放在相同的文件夹下,并且在此文件下还可以按歌手进行进一步分类。
    在这里插入图片描述

包:将Java代码更好归类归整,不让代码太乱。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如一个包中的类不想被其他包中的类使用。
在同一个工程中允许存在相同名称的类,只要处在不同的包中就可。

  1. 导入包中的类——import
    冗余的写法: java.util.Date date = new java.util.Date();
public class Test1 {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
        //得到一个毫秒级的时间戳
        System.out.println(date.getTime());
    }
}

使用improt语句导入包中的类的写法import java.util.Date; Date date = new Date();

import java.util.Date;

public class Test1 {
    public static void main(String[] args) {
//        java.util.Date date = new java.util.Date();
        Date date = new Date();
        //得到一个毫秒级的时间戳
        System.out.println(date.getTime());
    }
}

如果需要使用java.util中的其他类,可以使用import java.util.*,这里不是把util包里面所有的类都导进来,而是随用随取,用到哪个类,就会导哪个类(与C语言不同,C语言include是把头文件的所有内容都导进来)

  1. 使用*导入,可能会引起歧义,因为不同包的类名可以相同,在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
import java.util.*;
import java.sql.*;

public class Test1 {
    public static void main(String[] args) {
        Date date = new Date();
        //得到一个毫秒级的时间戳
        System.out.println(date.getTime());
    }
}

报错提示:
在这里插入图片描述
分析:util和sql中都存在Date这样的类,此时就会出现歧义,编译出错。
在这种情况下需要使用完整的类名。 java.util.Date date = new java.util.Date();

import java.util.*;
import java.sql.*;

public class Test1 {
    public static void main(String[] args) {
        java.util.Date date = new java.util.Date();
        //得到一个毫秒级的时间戳
        System.out.println(date.getTime());
    }
}

  1. 自定义包——操作步骤
    ①在IDEA中先新建一个包:src是Java默认的包,src就是这个文件夹下有很多.java文件
    在这里插入图片描述
    ②在弹出的框中输入包名:包名需要尽量指定成唯一的名字,通常会使用公司的域名的颠倒形式(例如:www.shuai.com的颠倒形式:com.shuai.www),包名要和代码路径相匹配,例如创建com.shuai.www的包,那么会存在对应的com/shuai/www来存储代码【对应3个文件夹】
    在这里插入图片描述
    在这里插入图片描述
    ③在包中创建类:在文件的最上方加上一个package语句,指定该代码在哪个包中,目的是为了声明当前类在哪个包底下
    在这里插入图片描述
    ④此时磁盘上的目录结构已经被IDEA自动创建出来了
    在这里插入图片描述

  2. 验证:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
    在这里插入图片描述
    如图所示,www和www2为两个不同的包,里面都有相同名称的Test类

  3. 关于访问修饰限定符的验证
    在这里插入图片描述
    ①被private修饰,只能类内自己使用,类外不能使用。

class Person {
    private String name;
    private int age;

    public Person() {

    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println(this.name + "吃饭");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Person person = new Person("小王",22);
        System.out.println(person.name);
    }
}

运行结果:
在这里插入图片描述
分析:因为成员变量String name是private权限,只能在Person类中使用,不能在Test2类中使用。
如何证明在Person类中可以使用?调用eat方法,因为eat方法中用到了成员变量name。

    public void eat() {
        System.out.println(this.name + "吃饭");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Person person = new Person("小王",22);
        person.eat();
    }
}

运行结果:
在这里插入图片描述
因此,private只能在当前类中使用,即同一包中的同一类

②默认权限default
验证default只能在同一个包中使用,也叫包访问权限
在com.shuai.www包下的Person类中:

package com.shuai.www;

public class Person {
    String name;
    int age;

    public void eat() {
        System.out.println(name + "吃饭");
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "小王";
    }
}

在com.shuai.www2包下的TestPerson类中:

package com.shuai.www2;
import com.shuai.www.Person;

public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "小王";
    }
}

可以发现在com.shuai.www2包下的TestPerson类出现报错:
在这里插入图片描述

综上,默认权限的成员变量只能在同一个包内访问。
③protected权限的变量在继承中学习
④pbulic权限:可以理解为一个人的外貌特征,谁都可以看到,可以任何其他类访问

  1. 常见的包
    ①java.lang:系统常用基础类(String、Object),此包从jdk1.1后会自动导入
    ②java.lang.reflect:java反射编程包
    ③java.net:网络编程开发包
    ④java.sql:数据库开发的支持包
    ⑤java.util:java提供的工具程序包(集合类等),非常重要
    ⑥java.io:I/O编程开发包

  2. get和set方法
    随着程序的运行,想要修改对象的成员变量,因为构造方法只能执行一次,因此提供公开的getheset方法来修改私有的成员变量。

class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = 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;
    }

    public void eat() {
        System.out.println(name + "eat");
    }
}

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("小王");
        System.out.println(person.getName());
    }
}

运行结果:
在这里插入图片描述
分析:在Person类中将成员变量name设置私有权限,则只能在Person类中访问,则在Test类中要想访问name成员变量,可以使用setName和getName方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeKnightShuai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值