【Java】java三大特性之封装

java封装类及类的使用

封装的概念

封装,简单来说,即将东西包在一起,然后以新的完整形式呈现出来。详细一点讲,即将方法和字段一起包装到一个单元中,单元以类的形式实现。

这里我们提到一个概念:信息隐藏,即通过封装,函数体被隐藏,只提供函数API的接口,通过隐藏对象的实现细节,不让外部直接访问或修改。这和封装这一特性密切相关。

将数据和方法包装进类中,加上具体实现的隐藏(访问修饰符),共同被称作封装,其结果是一个同时带有特征和行为的数据类型。

“定义类,定义其属性、方法的过程称为封装类”

封装类并且使用类:

class Student
{
	private int age;	//定义类的属性
	String name;
	double score;
	private int sex;
	
	void introduce()		//定义类的方法,方法 = 函数
	{
		System.out.println("name="+name+",age="+age+",score="+score);
	}
	
	void testFunc()
	{
		System.out.println("testFunc");
	}
	
}

public class Demo1 {
	public static void main(String[] args) {
		Student stu1 = new Student();	//实例化一个对象
		//类=模板
		//类不能直接使用,不能直接访问变量,需要先实例化,申请一个空间
		stu1.age = 18;		//给对象的属性进行赋值
		stu1.name = "yangchenyang";
		stu1.score = 98.5;
		
		stu1.introduce();		//调用对象的方法
	}
}


Java封装之访问修饰符

为什么用访问修饰符

说到访问修饰符,就要提到信息隐藏。

信息隐藏是最重要的功能之一,也是使用访问修饰符的原因,其包括:

  1. 对模块的任何实现细节所作的更改不会影响使用该模块的代码。
  2. 防止用户意外修改数据。
  3. 使模块易于维护和使用。

Java中的四种访问修饰符:

public(公共的)

protected(受保护的)

default(默认的)

private(私有的)

访问权限介绍

public 				可以被所有其他类所访问。

protected  			本类,同一个包中类及子类可以访问。

default				本类,同一个包内的类可以访问。

private				只能被本类访问和修改。

表格总结

在这里插入图片描述
访问修饰符的目的就是规范变量、方法、类的使用空间,

注意:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。

访问修饰符封装属性和方法


属性封装的实现

当我们将属性修改为private的时候,我们就限制了其他类对本类属性的访问,这时候我们就需要为每个属性创建一对赋值方法(setter)和取值方法(getter)方法,用于公开这些属性的访问接口。

方法封装的目的

隐藏方法的实现细节(方法体),向外部提供公开的接口(方法头),以供安全简化调用,方便修改维护,根据需要可以私有化方法,以供内部使用。
属性封装和方法封装。

具体代码实现如下:

class Student
{
	private int age;	//定义类的属性
	String name;
	double score;
	private int sex;
	
	
	
	private void myage(int myage)		//私有化方法,以供内部调用
	{
		age = myage;
	}

	public void setage(int realage)		//赋值方法
	{
		age = realage;
	}
	
	public int getage()		//取值方法
	{
		myage(18);		//内部调用私有化方法
		return age;
	}
	
	public void setsex(int finalsex)	//赋值方法
	{
		sex = finalsex;
	}
	
	public int getsex()		//取值方法
	{
		return sex;
	}
	
	void introduce()		//定义类的方法,方法 = 函数
	{
		System.out.println("name="+name+",age="+age+",score="+score);
	}
	
	void testFunc()
	{
		System.out.println("testFunc");
	}
	
}

public class Demo1 {
	public static void main(String[] args) {
		Student stu1 = new Student();	//实例化一个对象
		
		//stu1.age = 18;		//给对象的属性进行赋值
		stu1.setage(36);
		stu1.name = "yangchenyang";
		stu1.score = 98.5;
		
		stu1.introduce();		//调用对象的方法
		
		stu1.setsex(10);	//对属性赋值
		
		System.out.println("sex="+stu1.getsex());	//对属性取值
		System.out.println("age="+stu1.getage());	//对属性取值
	}
}


Java封装之构造方法

UML类图

统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。

类的命名尽量应用领域中的数据,应明确、无歧义,以利于相互交流和理解。类的属性、操作中的可见性使用+、#、-分别表示public,protected和private。

在这里插入图片描述

构造方法的概念和作用

  1. 构造方法负责对象的初始化工作,为对象的属性赋合适的初始值。
  2. 创建对象时,其类的构造方法确保再用户操作对象前,系统保证初始化的进行(构造方法再类被实例化的时候就被调用了

构造方法的语法规则

  1. 构造方法名与类名一致
  2. 没有返回类型
  3. 方式实现主要为字段赋初值

构造方法的调用

构造方法的调用很特别:new操作符(实例化对象的时候,自动被调用)

Java系统保证每个类都有构造方法

编程实现

class Student
{
	private int age;
	String name;
	double score;
	
	Student(){	//如果一个类没有写构造方法,系统回为之自动加上构造方法,参数为无参
		
	}
	
	Student(int newage, String newname, double newscore){	//构造方法可重载
		System.out.println("构造方法一被调用");
		age = newage;
		name = newname;
		score = newscore;
	}
	
	Student(int newage, String newname){	//构造方法可重载
		System.out.println("构造方法二被调用");
		age = newage;
		name = newname;
	}
	
	Student(int newage){
		System.out.println("构造方法三被调用");	//构造方法可重载
		age = newage;
	}
}

public class Test {
	public static void main(String[] args) {
		Student stu1 = new Student(18, "yangchenyang", 98.5);
		Student stu2 = new Student(18, "yangchenyang");
		Student stu3 = new Student(18);
	}
}

以上代码,我们自己实现了构造方法的重载。关于重载:

  1. java语言中,方法可以重载
  2. 重载后的方法名相同,参数列表不同
  3. 参数列表包括参数的名称、个数和顺序等。
  4. C语言不允许方法的重载。


Java封装之this关键字

this关键字的特点

  1. 在类的方法中,使用this关键字代表的是调用此方法的对象的引用。

class Student
{
	private int age;
	String name;
	double score;
	
	Student(int newage, String newname, double newscore){	//构造方法可重载
		System.out.println("构造方法被调用");
		age = newage;
		name = newname;
		score = newscore;
	}
	
	void testThis(){
		System.out.println(this.name);	//这里的this表示实例化后的对象
	}
}

public class Test {
	public static void main(String[] args) {
		Student stu1 = new Student(18, "yangchenyang", 98.5);
		stu1.testThis();
	}
}
  1. this可以看作是一个变量,它的值是当前对象的引用。

class Student
{
	private int age;
	String name;
	double score;
	
	Student(int newage, String newname, double newscore){	//构造方法可重载
		System.out.println("构造方法被调用");
		age = newage;
		name = newname;
		score = newscore;
	}
	
	void testThis(){
		Student stutemp = null;
		stutemp = this;		//在这里this被看作一个变量,stutemp被赋值为stu1
		System.out.println(stutemp.age);
		System.out.println(this.name);	//这里的this表示实例化后的对象
	}
}

public class Test {
	public static void main(String[] args) {
		Student stu1 = new Student(18, "yangchenyang", 98.5);
		stu1.testThis();
	}
}
  1. 使用this可以处理方法中的成员变量和形参同名的问题。(常用,解决二义性)
Student(int age, String name, double score){	//构造方法可重载
		System.out.println("构造方法被调用");
		this.age = age;
		this.name = name;
		this.score = score;
	}
  1. 当在方法内需要用到调用到该方法的对象时,就可以用this。
同第1
  1. 在类的构造方法中可以调用this([参数列表])来调用该类的指定构造方法。

class Student
{
	private int age;
	String name;
	double score;
	
	Student(){	//如果一个类没有写构造方法,系统回为之自动加上构造方法,参数为无参
		System.out.println("无参构造方法被调用");
	}
	
	Student(int newage, String newname, double newscore){	//构造方法可重载
		System.out.println("构造方法一被调用");
		age = newage;
		name = newname;
		score = newscore;
	}
	
	Student(int newage, String newname){	//构造方法可重载
		System.out.println("构造方法二被调用");
		age = newage;
		name = newname;
	}
	
	Student(int newage){
		//this();
		this(18, "yangchenyang", 98.5);		//只能调用一个构造方法
		//this(18, "yangchenyang");
		System.out.println("构造方法三被调用");	//构造方法可重载
		age = newage;
	}
}

public class Test {
	public static void main(String[] args) {
		Student stu3 = new Student(18);
	}
}


Java封装之static关键字

static关键字的特点

  • 用来修饰类的成员——修饰的成员变量的称为类变量(静态变量)
  • 修饰成员方法称之为类方法(静方法)
  • 当类被加载的时候就会被加载,优先于对象的存在
  • 用来修饰的语句块被称为静态代码块,先于构造方法之前执行,只会执行一次,用来对静态成员做初始化
  • 调用的时候可以直接通过类名.成员来访问

测试实例:


class Student
{
	private int age;
	String name;
	double score;
	static int data;
	
	Student(int age, String name, double score){	//构造方法可重载
		System.out.println("构造方法");
		this.age = age;
		this.name = name;
		this.score = score;
	}
	
	static{
		System.out.println("静态代码块,构造方法之前执行,只执行一次");
	}
	
	void introduce(){
		System.out.println("name="+name+",age="+age+",score="+score);
	}

}

public class Test {
	
	static int add(int a,int b){	//想要直接访问,必须加上static,否则就实例化对象,用对象名访问
		return a + b;
	}
	
	public static void main(String[] args) {
		Student stu1 = new Student(18, "yangchenyang", 98.5);
		Student stu2 = new Student(16, "lihua", 98.3);
		stu1.score = 10;	//非静态变量,必须实例化后用对象名访问
		
		Student.data = 10;	//静态变量,直接用类名访问,优先于对象存在
		
		System.out.println("ret="+add(1,3));
	}
}

static关键字的注意事项

  • 静态方法只能访问外部的静态成员
  • 静态方法中不能出现this关键字(this的是对对象的引用,而静态方法是先于对象存在的)


方法的重载

多数程序设计语言要求为每个方法(函数) 提供一个独一无二的方法名,不存在方法重载的概念,在java中,规定方法签名是解析方法的规则而不是方法名,为方法重载开创了条件。方法重载使得在一个类中,方法名相同而参数列表不同的方法可同时存在,代表相似的行为或功能。

重载overload的概念:同一个类中,同名不同参的方法称为重载方法

注意:仅有返回值不同的方法不能称为重载

方法重载并不陌生,Java.io.PrintStream类的println方法能打印数据,根据数据类型不同,有不同的实现方式:

public class Demo01PrintStream {
    public static void main(String[] args) throws FileNotFoundException {
        //创建打印流PrintStream对象,构造方法中绑定要输出的目的地
        PrintStream ps = new PrintStream("day10_IO\\print.txt");
        //如果使用继承自父类的的方法write写数据,那么查看数据的时候会查询编码表97-->a
        ps.write(97);
        //如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97-->97
        ps.println(97);
        ps.println('a');
        ps.println("Hello");
        ps.println(true);
    }

}


Java封装之包

打包的意义:

  • 标准java库是由一系列包组成,包括java.lang、java.util、java.net等等
  • 标准java包就是层次型包结构,就如同硬盘上嵌套的子目录一样,我们可以使用嵌套层次结构来组织包
  • Java的包是为了更好地规划代码,防止命名冲突和混乱。所以java出现了打包机制。
  • 当把类组织起来放进一个包内之时,也就给包中的成员赋予了相互访问的权限,您就拥有了该包内的程序代码
  • 包访问权限把类聚集在一个包中这一做法提供了意义和理由

Pacage——声明包

  • Java程序猿都可以编写属于自己的Java包,为了保证包名的唯一性,要求程序猿在自己定义的包的名字前加上唯一前缀
  • 由于互连网上的域名不会重复,所以推荐采用公司在互连网的域名的导致作为包的唯一前缀

在这里插入图片描述

包的用法

  • 一个类可以使用同一个包中的所有类
  • 一个类可以使用其他包中的所有公开类

怎么使用其他包中的公开类?

  1. 在每个类签名前加上完整包名,例如:
java.util.Data today = new java.util.Date();
  1. 更简洁更通用的方式:使用import语句来导包(eclipse:ctrl + shift + o),例如:
import java.util.Date;
······
Date today = new Date();
  1. 可以import特定类,也可以导入整个包。通过在源代码文件的顶部(在打包语句后)使用import语句来实现import语句来实现import java.util.*。


java三大特性之封装有关笔记记录完毕。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT阳晨。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值