Java——类和对象(二)

面向对象程序有三大特性:封装、继承和多态。封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

一、封装概述


  • 封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
  • 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问
  • 要访问该类的代码和数据,必须通过严格的接口控制
  • 适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

优点:

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

二、访问限定符


Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起。更符合人类对事物的认知,而访问权限用来控制那些方法或者属性需要在类外直接使用

范围privatedefaultprotectedpublic
同一个包中的同一个类可以访问可以访问可以访问可以访问
同一个包中的不同类可以访问可以访问可以访问
不同包中的子类可以访问可以访问
不同包中的非子类可以访问

注: protected主要用于继承中,default是什么都不写时的默认权限。

访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。一般情况下成员变量设置为private,成员方法设置为public

class Dog{
    //狗的属性
    private String name;//狗的名字
    public String color;//狗的颜色
    public String sex;//狗的性别
    String breed;//狗的品种
    public Dog(String name, String color, String sex, String breed){
        this.breed = breed;
        this.color = color;
        this.name = name;
        this.sex = sex;
    }
    //狗的行为
    public void run() {
        System.out.println("奔跑ing");
    }
    public void wag(){
        System.out.println("摇尾巴ing");
    }
}
public class Main{
    public static void main(String[] args) {
        Dog dog1 = new Dog("大白","金黄色","公狗","萨摩耶"); //通过new实例化对象
        //System.out.println(dog1.name);//会报错,因为name是私有的成员变量,只能在Dog类中被访问
        System.out.println(dog1.sex); //public属性,公有成员变量可以被其他类访问
        System.out.println(dog1.breed); //default属性,默认成员变量只能被当前包中的类访问
        dog1.run();
        dog1.wag();
    }
}

三、包


为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
包的作用

  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用
  • 如同文件夹一样,包也采用了树形目录的存储方式。
  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

1、 创建包

  • 包名需要尽量指定成唯一的名字,通常使用互联网域名的颠倒形式来作为它的包名。包中的每一个部分对应一个子目录。
    示例:com.csdn.test的包,包里包含了一个Test.java文件
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。

  • 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。

示例:以下代码就被放在一个叫做testcode的包中。命名通常使用小写,避免冲突。

package testcode;

import java.util.*;
public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getTime());
    }
}

在这里插入图片描述

2 、导入包中的类

例如Date类:可以使用java.util.Date导入java.util这个包中的Date类。

使用import导入

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

也可使用以下方式导入

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

使用这个包中的其他类,可以使用一种简便的导入方式import java.util.*
但是一般建议明确指出要导入的类名,否则可能会导致冲突。

import java.util.*;
import java.sql.*;
public class Test {
	public static void main(String[] args) {
	// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
	Date date = new Date();
	System.out.println(date.getTime());
	}
}

在这里插入图片描述
注: 在这种情况下就要使用完整的类名。

四、包的访问控制权限


下面将举个例子来介绍下访问控制权限。
示例:创建包package com.csdn.animal1package com.csdn.animal2Dog.java放在animal1中,TestDog.java放在animal2中。
在这里插入图片描述

//Dog.java
package com.csdn.animal1;

public class Dog{
    //狗的属性
    private String name;//狗的名字
    public String color;//狗的颜色
    public String sex;//狗的性别
    String breed;//狗的品种

    public Dog(String name, String color, String sex, String breed){
        this.breed = breed;
        this.color = color;
        this.name = name;
        this.sex = sex;
    }
    //狗的行为
    public void run() {
        System.out.println("奔跑ing");
    }
    public void wag(){
        System.out.println("摇尾巴ing");
    }
}
//TestDog.java
package com.csdn.animal2;
import com.csdn.animal1.*;

public class TestDog {
    public static void main(String[] args) {
        Dog dog = new Dog("大黄", "金黄色", "公狗", "萨摩耶"); //通过new实例化对象
        System.out.println(dog.color); //正常运行,public属性,公有成员变量可以被其他类访问
        //System.out.println(dog.name);//报错,私有变量,不允许被其他类访问   
        //System.out.println(dog.breed); //报错,不允许被其他包中的类访问
        dog.run();
        dog.wag();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值