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的作用等等都在代码的注释中,可以细看代码的注释。
其他的代码也有相应的注释,不理解可以拿代码执行并看注释