Java面向对象一、封装、构造方法、构造代码块和局部代码块、this关键字

11 篇文章 0 订阅
5 篇文章 0 订阅
本文深入讲解Java中的封装概念,包括如何使用private关键字隐藏类的属性和方法,通过setter和getter方法提供外部访问接口。同时介绍了构造方法、构造代码块、局部代码块及this关键字的应用。
摘要由CSDN通过智能技术生成

Java中面向对象之封装

以下笔记按这个顺序进行

  • 封装
  • 构造方法
  • 构造代码块和局部代码块
  • this关键字

封装

  • 首先肯定要说说概念的,那么什么是封装呢?封装有什么作用呢?
  • 封装是通过关键字private,将对象的属性和实现细节隐藏起来,仅仅只对外部提供使用和访问权限,但是不能看到我内部的细节以及实现的代码。那么它的好处是保证代码的安全性和重用性,常在一个类中将方法和属性进行封装
  • 封装最终也是要给别人用的,所以我可以将私有方法通过内部调用,然后将调用方法的那个公有方法呈现给外部使用,这样只给别人使用而不给别人看到内部细节的方法称为封装。
import java.util.Scanner;
//这里是测试类,通过这个类进行封装的测试
public class fengzhuang{
	public static void main(String[] args){
	//创建一个text类的对象,通过对象调用方法验证属性和方法的封装
		text a  =	new text();
		a.setName(new Scanner(System.in).next());
		a.zoulu();
		String b = a.getName();
		System.out.println(b);
	}
}

//封装,使用private关键字把属性和方法封装起来,将方法和属性变为私有,对外不展示,这个过程就称为封装
//那么封装最终也是要给别人用的,所以我可以将私有方法通过内部调用,然后将调用方法的那个公有方法呈现给外部使用,这样只给别人使用而不给别人看到细节的方法称为封装。
class text{
	//将属性封装变为私有属性
	private String name;
	private int age;
	//setName属性调用的公开方法,可以提供给外部使用,但是不让外部接触到我内部的属性
	public void setName(String name){
	//这里出现了一个this关键字,这里后面会说到
		this.name = name;
		System.out.println(name);//插眼测试
	}
	//getName返回属性值的公开方法,提供给外部使用,但不让外部接触到我内部属性
	public String getName(){
		return name;
	}
	//这个是我内部的私有方法,不可以提供给外部使用,但是可以通过上面类似的调用方法进行调用,但是外部却看不到我的具体实现代码,只能使用功能
	private void shangke(){
		System.out.println("学习");
	}
	//zoulu()是给外部使用的调用内部私有方法的,这个方法是公开性质的
	public void zoulu(){
		shangke();
		System.out.println("走路");//这里也是插眼测试
	}
}

以上代码中可以看到我是使用setXX方法和getXX方法进行赋值和取值,那么为什么一定要是set和get呢,这个其实在Java中算是规定使用的,但是你不按照这个当然也可以。以下是写好私有属性后使用快捷步骤生成setXX方法和getXX方法
第一步先创建好类,写好私有属性
在这里插入图片描述
之后在菜单栏找到Source中尾缀是Setters…的选项
在这里插入图片描述
进去后将你需要生成方法的属性勾选,点ok就行了
在这里插入图片描述之后就会自动生成setXX和getXX方法
在这里插入图片描述
封装基本就上面那些内容,下面说一些在封装中比较特殊的东西

构造方法

  • 构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时会自动调用构造方法。
  • 因为之前还没记过构造方法的创建和重载,这里先大概说一下它的创建和重载
  • 创建:修饰符 类名(){方法体} 这就是构造方法的格式,基本上最重要的一点在于方法和类名一致,当我不写修饰符时它会给我自动默认权限,也是可以创建的。
  • 重载:之前说过方法的重载,方法重载主要通过改变参数列表进行方法重载,那么构造函数同样也是通过改变方法的参数列表进行函数重载的。修饰符 类名(参数){方法体}
class text{

	public text(){
		System.out.println("无参构造方法");
	}
	//通过改变方法的参数进行重载
	public text(int a){
		System.out.println("含参的构造方法");
	}	
}

注:这里有一个注意的点,构造方法是用来进行创建对象或者对象初始化使用的,那么平时我们声明对象或者对对象初始化时,没有特别的将构造函数声明出来,也可以进行调用,会造成这样的原因的是,我们在创建类后,就会自动有一个无参的构造方法被创建,只是被隐藏了起来,我们看不到。而如果我特意的声明一个含参的构造方法后,我再次调用无参构造方法创建对象时,就会出错,因为当我主动声明构造方法后,无论有参无参,之前被程序隐藏起来的构造方法都会消失掉。

当构造方法被封装后
很明显的一个作用,无法创建对象或者对象初始化
在这里插入图片描述
在我勾选出来的代码处,我将这个类的构造方法进行私有化(private)后,我再进行创建对象就会出错,可以解决的办法可以重载一个公开(public)的含参构造方法

构造代码块和局部代码块

  • 构造代码块:位置位于类里方法外,主要作用是提取构造方法的共有属性或则共有代码块。在调用构造方法之前都会先调用构造代码块
public class 封装_text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new text();//先调用无参构造方法
		new text(1);//再次调用有参构造方法
	}

}
//通过多个构造方法进行对比
class text{
//这里是构造代码块
	{
		System.out.println("比如这是三个构造方法的共有属性");
	}
	
	public  text(){
		System.out.println("这是特有属性");
	}
	public text(int a){
		System.out.println("这是含参的特有属性");
	}
	public text(String a){
		
	}	
}

运行结果如下:
在这里插入图片描述
通过这里可以发现在发生构造函数调用后,首先会执行构造代码块内的代码,之后才会执行构造方法内的代码。

  • 局部代码块:位置:方法里的代码块。作用:最大的作用是限定变量的作用范围,当局部代码块内部的代码执行完毕以后,代码内声明的变量会被立刻释放,不会侵占内存,节约内存的使用。
public class 封装_text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new text().t();
	}

}

class text{

	public void t(){
		System.out.println("这里展示代码的执行顺序");
		{
			//这里我在局部代码块内创建一个变量,并给变量赋值
			int a= 12;
			System.out.println(a);
		}
		//在局部代码块执行结束以后,我有创建了一个同名同类型的变量,并没有报错。
		//这个变量的创建成功说明我代码块内的变量a并没有造成影响,并且可以说明代码块内的变量a在执行后被释放内存
		int a=14;
		System.out.println(a);
	}	
}

在这里插入图片描述
这里输出结果说明局部代码块是按代码上到下顺序执行的,并不是构造代码那样被优先执行。

this关键字

  • this关键字的作用:this关键字主要用于调用本类中的成员变量和成员方法,也可以在多个构造方法中互相调用,只是调用时需要将this放在第一句
  • 那么为什么要使用this调用本类成员呢?它的意义在哪儿呢?那么this关键字所解决的问题就是当我的成员变量和局部变量重名时的情况。

public class this_gjz {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		this_text a= new this_text();
		a.setName("yang");
		System.out.println(a.getName());
		a.text();
	}

}
//this关键字,在本类里调用本类的成员,成员变量和方法都可以
//大多数可以省略,当成员变量和局部变量同名时,一定要使用this
//多个构造方法之间的互相调用,需要使用this
//如果想要完成构造方法间的调用,使用this;
//如果使用this调用构造方法,必须将调用或者this语句放在第一句
class this_text{
	
	private String name;
	private int age=20;
	//这个方法只是我写出来进行测试的一个方法
	public void text(){
		//这里声明一个和成员变量age同名的局部变量age;
		int age = 10;
		//这里是不使用this关键字时对age进行赋值,可以发现它使用的age是局部变量age
		age = 100;
		//这里是使用this关键字后再次对age进行赋值,可以发现它使用的age是成员变量age
		this.age = 200;
		//输出不使用this关键字的age的值
		System.out.println(age);
		//输出使用this关键字时age的值
		System.out.println(this.age);
	}
	
	public String getName(){
		return name;
	}
	public void setName(String name){
		//通过this调用成员变量name
		this.name = name;
	}
	public this_text(){
		//在无参构造方法中使用this调用有参构造方法,使用this调用时通过参数进行判断调用的是那个
		this(1);
	}
	public this_text(int a){
		//通过this调用两个参数的构造方法,并且this要放在第一句
		this(1,2);
		System.out.println(123);
	}
	public this_text(int a,int b){
//		this();//这里不能进行循环调用,不通过
		System.out.println(456);
	}
}

实现如下:
在这里插入图片描述
大部分对this的解释以及this的作用等等都在代码的注释中,可以细看代码的注释。

其他的代码也有相应的注释,不理解可以拿代码执行并看注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值