封装概念的进一步理解,类与对象的拓展,编写一个简单的类

B站影视 港台电影 2025-03-19 18:59 1

摘要:OOP(Object-oriented Programming )即面向对象编程先从其所具有的三大特性来讲,一个是封装,一个是继承,一个是多态,接下来对这三个点进行拓展,什么是封装,就是把属性和功能捆绑在一起,并对外部隐藏具体细节,比如如果我们想要得到最大值,

OOP(Object-oriented Programming )即面向对象编程
先从其所具有的三大特性来讲,一个是封装,一个是继承,一个是多态,接下来对这三个点进行拓展,什么是封装,就是把属性和功能捆绑在一起,并对外部隐藏具体细节,比如如果我们想要得到最大值,会调用函数Math.max;但在这一行简单的代码背后,还包含着更多的实现细节,而为了代码的简洁,确保读者更清晰的把握结构,会把实现该函数的过程打包封装在别处,只在此处调用该方法即可,继承和多态放在日后学完对应知识后再去讲。
接下来对类与对象的具体概念进行剖析。什么是类,类是一个模板,一切具有共性的事物都可以被划分成一个类。在类当中,有各种各样的数据类型,有各种不同的方法。而对象,就是经过类所创建的具有其属性,能够调用其方法的东西。从人的角度来讲,人具有年龄 成就 外貌 等其他人一样具有的属性,而一个个在人的范畴里面的不同人就可称之为对象。类是对象的抽象,对象是类的具象。类具有对象的所有属性,对象可以对于这些属性赋入不同的值。在我们日常编写代码的过程中,可能会遇到需要大量的重复性的变量名,比如用户注册系统,需要创建上百几千个字符串类型的变量名,例如名字。一步一步的去创建变量不利于代码的简洁性,因此我们需要将这些对象共有的属性打包成一个类,这其实也是封装的一种表现形式。这也意味着创建一个类,需要去了解会出现哪些属性,而具有不同的数据类型的属性,拥有着不同方法的类,也可以被称为复合型数据类型,而复合型数据类型,又被称为引用数据类型,引用数据类型包括类 接口 数组 当然还有笔者在上上篇博客当中重点去讲的字符串。还有包括StringBuilder这样一个笔者使用过的类,它代表着一个可变字符序列的类。那么经由该数据类型创建出来的对象,也可以被称为变量,而从程序的角度来讲,对象可以理解为类在计算机中映射出来的一个数据体,并且这个数据体存在于内存当中

接下来我们尝试着自己去建一个类,所以我们需要去知道如何创建一个类,也就需要知道相应的语法。
public class类名{},注意类名后面不需要跟括号。然后需要根据我们所需要的属性和方法一个一个去配置,
那么如何去定义属性呢:
数据类型 变量名;
定义方法:
public(private) (static) 返回值类型(int/String/boolean/int )/void 方法名(传入的参数){ }
接下来需要注意一个细节,构造方法和调用方法的括号内的参数类型需顺序一致,在调用方法的时候,只需写对应数据类型的变量名,在构造方法的时候,需要写数据类型 变量名如(int n,int m,String str,char c)

方法内部需要三块构造,一个是方法的具体细节 一个是参数 一个是返回值,返回值的数据类型与定义的方法的类型一致,并且需要在代码内部任何有可能结束运行的位置都要加入return,当然也只是这么说,需要根据自己的具体代码判断,一个方法内部可能会有多处return,多见于if else 结构中

对于静态方法的拓展理解,在定义方法时,在public和返回值类型之间加入修饰符static,该方法就成为了一个静态方法,可以通过类名进行调用,比如说min这个方法就是通过Math这个工具类进行调用,不需要通过对象去调用,而非静态方法则必须通过创建对象来进行调用,不能通过类名进行调用

尝试自己去按照所总结过的方法去创建一个类
在创建类中方法的时候又遇到两个问题。1.在进行最终结果的赋值时,不能直接用方法名本身来赋值,返回值的时候,也不能使用方法名本身来返回,都需要创建一个中间变量,赋值和返回都需要这个中间变量。2.需要在类中创建主函数,而在主函数中对属性进行赋值时,需要通过具体对象去调用,不能直接是"变量名 = ;" 调用方法也是如此,而在调用完方法在括号中传入参数的时候还需要通过对象去调用属性来作为参数,具体代码如下:

package fjm0811;public class Student { String name; int age; int credits; int ID; int EScores; int MScores; int CScores; public int finalScores(int EScores,int MScores,int CScores){ int fin=0; fin=(EScores+MScores+CScores)/3; return fin; } public static void main(String args) { Student s1=new Student; s1.age=12; s1.name="张三"; s1.EScores=100; s1.CScores=20; s1.MScores=233; int fin= s1.finalScores(s1.EScores,s1.MScores,s1.CScores); System.out.println(fin); }}

至此,今天课程内容的复盘,整合,拓展完成,剩余部分将在明天上完课后补齐。

关于封装的进一步细致理解,可分为“封”和“装”。“封”就是进行限制,限制范围,通过访问修饰符来界定这个方法或者这个类能在别处进行调用。而访问修饰符一共有4个,一个是public 一个是private 一个是 protected 一个是不写 public的意思就是公共的,意味着我这个类或者我这个方法可以在别的子文件中调用,而private的意思就是私人的,意味着我这个类或者方法只能在本文件中调用。还有一个是protected,意思就是受保护的,只能在本包和子类中去调用,可以理解为这个类只能在本地圈子和远方亲戚中被调用,及分别为你的本包和子类,其他的包是无法调用的。而不写则代表你所创建的这个类是一个普通类,一个子文件里面可以创建很多的普通类,例如创建一个class Main { } 来存放主函数,使得代码中存在一个类来专注于程序的启动,其他类专注于各自的功能和业务模块,使得职责划分更明确,所以不光是main函数,封装不同的类这一种方法,是很符合面向对象的设计理念的。并且这四个访问限制符,除了构造代码块和静态构造代码块前面加不了之外,其他所有代码部分都可以加,无论是类,属性,方法,构造方法,前面都可以加。但要注意有一个特例,那就是类,如果子文件名和类名一致,则该类前面必须加public 访问修饰符,或者不加。不能加另外两个接下来讲装,什么叫装呢,就是打包的意思。把需要的代码包装在一个类里面。如果不想让某个成员属性暴露在外,存在被其他子文件随意调用和改变的可能,那就在数据类型前面加上private,将这个成员属性封装在本类之中。封装完本类之后,之后我们需要去调用或者赋值属性,此时我们可以通过创建方法去达到这一目的,有两个具体方法,一个是读,一个是写,读就是取出变量的值,写就是对变量进行赋值。“读”方法的创建需要创建返回值,按照如下格式:
public int get属性{
return 属性变量;
}
“写”方法的创建不需要返回值,但需要传入参数,是把参数的值传给属性变量。格式如下:
public void set属性(数据类型 参数值){
属性变量=参数值;
}
接下来使用实例,实际去展现“写”方法的应用以及实际当中所遇到的一些问题:

public void setName( String name){ this.name=name;}

如果传入的参数为空,这个方法是得不到被新赋值的属性变量的,有也是null;如果传入的参数不符合范围,也是不符合题目需求的。因此为了避免这种情况,需要在其中加入条件判断

public void setName( String name){//对于任何一个非基本数据类型变量,都使用null对其进行判断 if(name==null || name.equals("") || name.length

接下来讲类的结构 ,类 可以被分为两部分 一个是面向对象部分,一个是静态资源部分(就是特性为“静态”的块代码)面向对象部分分为三部分,一个是成员属性,一个是成员方法,一个是构造部分,构造部分又分为两个,一个是构造方法,一个是构造代码块。这两者或者构造部分都会在类创建对象的时候进行调用。关于构造方法,第一个可以讲他的编写格式:public 类名{ },第二个可以讲它的作用,其作用之一就是为了给成员变量赋入初始值,避免之后因为使用了未初始化的变量而编译错误。第三个可以讲它的特性:构造方法具有如下特性:1.每一个类里面都会有一个隐式的空参数构造方法。2. 一旦创建了一个显式方法,原先的隐式方法就会被覆盖掉。3.一个类里面也可以创建多个构造方法,区分在于传入参数的不同,在类创建对象调用构造方法的时候,只会调用众多构造方法中的一个,具体调用哪一个方法,取决于创建对象的参数。第四个可以讲他的类别:分为无参数构造方法和有参数构造方法。注意不是只有有参数构造方法才能完成对成员变量的初始化赋值,无参数构造方法也可以。关于构造代码块:没有所谓的返回值和参数,在{ }里面编写即可。偶尔可能在前面加上一个static修饰符,作为静态代码块,静态代码块在类名创建对象时只会调用一次。并且代码块也可以创建多个,类名创建对象时也会一并执行,这就是跟构造方法的不同了,后者创建多个,只会调用一个,前者创建的都会调用,所以创建三四个构造代码块和创建一个构造代码块的区别不大。然后我们通一份代码去直观的感受类中各个部分的位置(其实一般来说没有什么严格的顺序)

public class Student{ //成员变量 String stuName; int age; int stuID; //构造方法 public Student{}//为无参数构造方法 public Student(String stuName)//为有参数构造方法{ this.stuName=stuName;//this就是这个类,这份代码的意思就是把传入进来的参数赋给成员变量完成初始化 } //代码块 { System.out.println(stuName) } { System.out.println(stuName) } //成员方法: public void showInfo{ System.out.println(stuName) ;//注意,在成员方法里面如果要调用成员变量,是不需要通过创建对象去调用的,直接输入成员变量的变量名就行} //主函数: public static void main(String args){ Student stu=new Student;//注意此时就可以引用刚刚所讲的构造方法的特性,去看看你所创建的对象参数,如果为空就调用无参数构造方法,如果有参就调用有参数构造方法 Student stu=new Student("张三");//此时就是调用一个有参数构造方法而有参构造方法和无参构造方法初始化成员变量所需的代码不同,例如: Student stu=new Student; stu.stuName="张三"; Student stu=new Student("张三"); } }}

接下来引入两个修饰符,一个是final,一个是static 经过final修饰的数据被赋入初始值后续都不可以修改值了,一旦尝试修改就会报错,那么接下来就会遇到一个问题,在创建用户管理系统时,从语法上来讲,常量需要被初始化赋值才不会报错,而现实需求又需要我们对一个常量有许许多多的值,例如每个人的学号。这时候我们有两种需求:第一个,使用正确的构造方法,可以不在最开始对常量进行赋值,但要把我们需要的常量作为参数传入每一个构造方法中,并在每一个构造方法中去调用成员变量,并把参数值传入成员变量,注意赋值的格式一定是 this.ID=ID; ID作为参数。或第二个,我们也可以在构造代码块中对常量进行赋值,例如

{ ID=10;}

学习一个创建随机数的方法:int id=new Random.nextInt;括号里面跟变化范围,这个方法可以对常量进行不同的赋值,至此,面向对象部分已经讲完,通过另一个修饰符static的引入,我们开始探索静态资源。静态资源包括了静态属性,静态方法,静态代码块。首先明白static的意思,唯一的,唯一的不代表不变的,static不是final,被它所修饰的值是可以改变的,接下来讲static的三大特性:被static修饰的事物只属于类,不属于对象。被static修饰的方法可以直接被通过类名调用。被static修饰的属性和方法只有一份,不会随着新对象的创建而创建,且被所有对象共享,接下来向原代码引入静态方法:

public class Student{ //成员变量 String stuName; int age; int stuID; //构造方法 public Student{}//为无参数构造方法 public Student(String stuName)//为有参数构造方法{ this.stuName=stuName;//this就是这个类,这份代码的意思就是把传入进来的参数赋给成员变量完成初始化 } //代码块 { System.out.println(stuName) } { System.out.println(stuName) } //成员方法: public void showInfo{ System.out.println(stuName) ;//注意,在成员方法里面如果要调用成员变量,是不需要通过创建对象去调用的,直接输入成员变量的变量名就行} //静态资源: //静态属性: //无论后续是通过对象还是类去进行调用,都是调用同一份 //在静态属性中创建常量都是需要将变量名进行全大写 static int ae=700; static String ared="字符串"; static final int MAX_VALUE=10000; //静态方法: public static void staticMethod{ //注意静态方法内部不能调用本类的成员属性和成员方法,一调用就会报错} //静态代码块 //注意静态代码块会在类第一次创建对象时调用有且仅有一次。并且会先于类中的其他部分执行, static { } //主函数: public static void main(String args){ Student stu=new Student;//注意此时就可以引用刚刚所讲的构造方法的特性,去看看你所创建的对象参数,如果为空就调用无参数构造方法,如果有参就调用有参数构造方法 Student stu=new Student("张三");//此时就是调用一个有参数构造方法而有参构造方法和无参构造方法初始化成员变量所需的代码不同,例如: Student stu=new Student; stu.stuName="张三"; Student stu=new Student("张三"); } }}

*注意事项,当创建了两个对象时,如果先后对两个对象的相同静态成员属性赋值,那么这两个对象的成员属性就都是最后一次赋入的值,当需要给不同的对象里的成员属性赋值时,不能直接调用成员属性进行赋值,而是调用方法,调用一个个形如setName ,getName等方法。

因此实际上我们在解决“根据对象的不同来改变对应的常量值”实际上有三种解决方法,一个是构造方法,一个是普通方法,一个是构造代码块。下面通过实写两段代码实现构造普通/成员方法和构造方法来解决该需求:

//构造方法:public Student(String name,String gender, int age, String number){ if(name==null || name.equals("") || name.length18){ this.age=age;} if(number==null || number.length//构造普通/成员方法 public void setName(String name){if(name==null || name.equals("") || name.length=18){ this.age=age;} public void setNumber(String number){if(number==null || name.equals("") || name.length

无论是构造方法还是成员方法都需要在类中进行编写。至此解决了项目中需要根据需求改变常量值的问题。

来源:云云课堂

相关推荐