当前位置: 首页 > 后端技术 > Java

JAVA中类和对象的理解

时间:2023-04-01 22:46:14 Java

1.面向对象面向对象(OOP)程序是由对象组成的,每个对象包含特定的功能部分,对用户开放。程序中的很多对象来自标准库,有些是自定义的。是自己建造还是从外面购买完全取决于开发项目的预算和时间。不过,从根本上说,只要对象能够满足要求,就无需关心其功能的具体实现过程。在OOP中,你不必关心对象的具体实现,只要能满足用户的需求即可。面向对象关注对象,即参与过程中涉及的主体。就是通过逻辑把函数一一串起来。简而言之,面向对象就是用代码(类)来描述客观世界中事物的一种方式。类主要包括事物的属性和行为。【面向对象的概念】:1、面向对象是一种思考问题的方式,是一种思维方式。例如:概念和例子。理论与实践。名实等。2、类是一类对象的总称。对象是这种具体化的实例。3.面向对象的好处:把复杂的东西简单化,只面向一个对象。二、类和类的实例化2.1类类是一类对象的统称。对象是这种具体化的实例。一个简单的例子:我们用来做月饼的模具是一个类,通过这个模具就可以做出月饼,所以在这个例子中,类就是模具,月饼就是对象,所以月饼就是一个实体。一个模型可以实例化无数个对象。一般来说:类相当于一个模板,对象是模板生成的样本。一个类可以生成无数个对象。声明一个类就是创建一个新的数据类型,而类在Java中是引用类型,Java使用关键字class来声明类。先看一个类的简单声明:classPerson{//Field属性成员变量定义在类内部,方法外部//成员变量分为普通成员变量,静态成员变量publicStringname;publicintage;//成员方法//成员方法分为普通成员方法和静态成员方法publicvoideat(){System.out.println(name+"eating");}publicvoidsleep(){System.out.println(name+"Sleeping");}}class是定义类的关键字,Person是类名,{}是类的主体。类中的元素称为:成员属性。类中的函数称为:成员方法。2.2类实例化创建具有类类型的对象的过程称为类实例化。一个类只是一个模型,它定义了这个类有哪些成员。一个类可以实例化多个对象,实例化后的对象占用实际物理空间,存放类成员变量。例如。从一个类中实例化一个对象就像在现实中用建筑设计图盖房子一样。对象实际上可以存储数据并占用物理空间。举个例子:classPerson{publicStringname;publicintage;//成员属性实例变量//成员方法//成员方法分为普通成员方法和静态成员方法publicvoideat(){//成员方法System.out.println(name+"issleeping");}publicvoidsleep(){//成员方法System.out.println(name+"issleeping");}}publicclassTest01{publicstaticvoidmain(String[]args){Personperson=newPerson();//通过newperson.name="zhang"实例化对象;person.age=10;System.out.println(人名.name);//访问成员变量需要通过对象引用访问person.eat();//通过对象引用调用方法person.sleep();//生成对象实例化objectPersonperson2=newPerson();//一个类可以实例化多个对象Personperson3=newPerson()}总结:new关键字用于创建一个对象的实例。使用。访问对象中的属性和方法。同一个类可以实例化多个对象。2.3类的成员类的成员可以包括:字段、方法、代码块、内部类和接口等。首先看字段(成员变量):2.3.1字段/属性/成员变量在类,但变量定义在方法之外。我们称这些变量为“字段”或“属性”或“成员变量”。对于对象的某个字段,如果没有显式设置初始值,则会设置一个默认的初始值。默认值规则:对于各种数值类型,默认值为0。对于布尔类型,默认值为false。对于引用类型(字符串、数组和自定义类),默认值为null。很多时候我们不想让字段使用默认值,而是需要显式设置初始值,可以这样写:classPerson{publicStringname="张三";publicintage=18;}认识nullnull在Java中是一种“空引用”,意思是不引用任何对象。类似于C语言中的空指针。如果对null执行操作,则会抛出异常。publicstaticvoidmain2(String[]args){Personperson=null;//表示这个引用没有指向任何对象Personperson1=newPerson();Personperson3=person1;//表示person3的引用指向person1的引用所指向的对象person1=newPerson();//一个引用不能同时指向多个对象person1=newPerson();person1=newPerson();}2.3.2方法方法用于描述一个对象的行为。比如2.2例子中的eat方法和sleep方法,表示Person对象有一个“展示自己”的行为。这样的eat方法和sleep方法与person实例相关联。如果创建了其他实例,那么eat方法和sleep方法的行为将会改变。Java培训2.3.3static关键字所有被static修饰的方法或属性都不依赖于对象。A。修饰属性Java静态属性与类有关,与具体实例无关。这些实例共享相同的静态属性。count++;System.out.println(t1.a);System.out.println(TestDemo.count);System.out.println("============");TestDemot2=newTestDemo();t2.a++;TestDemo.count++;System.out.println(t2.a);System.out.println(TestDemo.count);}}输出结果:1112count被static修饰,共享类。而且不属于对象,访问方式为:类名。属性b.修饰方法如果static关键字应用于任何方法,则此方法称为静态方法。静态方法属于类,不属于类的对象。静态方法可以直接调用而无需创建类的实例。静态方法可以访问静态数据成员,也可以改变静态数据成员的值。对于静态成员变量直接通过类名访问:类名。静态成员属性/方法。publicstaticvoidstaticFunc(){//静态方法内部不能调用普通方法,静态方法不依赖对象System.out.println("static::func()");}publicvoideat(){System.out.println(name+"eating");}publicvoidprint(){staticFunc();//普通方法内部可以调用静态方法,但是不能定义静态变量System.out.println("Name:"+name+",age:"+age);}静态方法与实例无关,而与类有关。所以这就导致了两种情况:静态方法不能直接使用非静态数据成员或者调用非静态方法(非静态静态数据成员和方法是和实例相关的)。关键字this和super不能在静态上下文中使用(this是对当前实例的引用,而super是对当前实例的父类实例的引用,也与当前实例相关。c.代码block使用static定义的代码块,一般用于初始化静态成员属性,后面代码块中会详细说明。d.修改类3.封装3.1私有实现封装private/public这两个关键字代表“访问控制”。public修饰的成员变量或成员方法可以直接被类的调用者使用。私有变量或成员方法修饰的成员不能被类的调用者使用。也就是说,类的使用者根本不需要知道,也不需要关注一个类有哪些私有成员。让类的调用者能够以较低的成本使用它使用类.private不仅可以修改字段,还可以修改方法。通常,我们会将字段设置为private属性,但是method是否需要设置为public,要视具体情况而定。一般我们希望一个类只提供“必要的”公共方法,而不是将所有方法都公开。3.2getter和setter方法当我们使用private修饰一个字段时,不能直接使用这个字段。这时候,如果我们需要获取或者修改这个私有属性,就需要使用getter/setter方法。类Person{privateStringname;privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}}[注]:getName是getter方法,意思是获取这个成员的值。setName是setter方法,意思是设置这个成员的值。当set方法的形参名称与类中的成员属性名称相同时,如果不使用this,则相当于自赋值。这表示当前实例的引用。并不是所有的字段都必须提供setter/getter方法,而是要根据实际情况来决定提供哪种方法。四、构造方法构造方法是一个特殊的方法,在使用关键字new实例化一个新的对象时会自动调用它来完成初始化操作。构造方法没有返回值。新的执行过程:为对象分配内存空间。调用对象的构造方法。语法规则:1、方法名必须与类名相同。2.构造方法没有返回值类型声明。3、每个类方法中必须至少有一个结构体(如果没有明确定义,系统会自动生成一个无参构造函数。【注意】:如果类中没有提供构造函数,编译器会生成一个无参构造函数默认情况下,也就是说:一个类至少会有一个构造方法,如果当前类中还有其他构造方法,编译器是不会帮我们生成一个没有参数的构造方法的,构造方法可以重载,并且规则与普通方法的重载一致。重载:方法名相同,参数列表不同,不需要返回值。classPerson{privateStringname;privateintage;publicPerson(){System.out.println("Constructorwithoutparameters");}publicPerson(Stringname,intage){this.name=name;System.out.println("constructorwith1parameter");}publicPerson(Stringname,intage){this.name=name;这个。年龄=年龄;System.out.println("with2parameters构造方法");}publicvoidshow(){System.out.println("name:"+name+"age:"+age);}}publicclassMain{publicstaticvoidmain(String[]args){Personp1=newPerson();//调用无参构造函数,如果程序没有提供就会调用无参构造函数p1.show();Personp2=newPerson("zhangfei");//以1个参数调用构造函数p2.show();Personp3=newPerson("zhangfei",80);//调用2个参数的构造函数p3.show();}}this关键字this表示当前对象引用(注意不是当前对象)。可以使用this来访问对象的字段和方法1.this.data调用当前对象的属性例子:publicvoidsetName(Stringname){this.name=name;//this代表当前对象的引用object}publicStringgetName(){returnname;}2.this.func()调用当前对象的方法示例:publicvoideat(){System.out.println(name+"eating");}publicvoidprint(){这个。吃();静态函数();//普通方法内部可以调用静态方法,但是不能定义静态变量System.out.println("name:"+name+",age:"+age);}3、this()调用当前对象Other构造方法保存在构造函数中!!!例子:publicPerson(){this("name",12);//调用2个参数的构造方法this必须放在第一行System.out.println("Constructorwithoutparameters");}publicPerson(Stringname,intage){this.name=name;这个。年龄=年龄;System.out.println("Constructorwith2parameters");}输出结果:一个有2个参数的构造方法和一个无参数的构造方法name125.代码块使用{}定义一段代码。根据代码块定义的位置和关键字,可以分为以下四种:1.普通代码块2.构造块3.静态块4.同步代码块类Person{//普通成员变量,属于totheobjectprivateStringname;privateintage;//静态成员变量不能定义在方法中publicstaticintcount=10;//静态成员变量->类变量放在方法区{this.age=90;System.out.println("实例代码块");}static{//本质上是初始化staticThingscount=99;//如果全是静态的,那么跟定义的顺序有关//静态代码块,示例代码块System.out.println("==============");人person2=newPerson();//示例代码块静态代码块只会执行一次}publicstaticvoidmain6(String[]args){System.out.println(Person.count);//静态代码块也可以在不实例化对象的情况下执行,并且只执行一次}静态代码块和实例代码块在类加载时执行。静态代码块无论生成多少对象,都只会执行一次,先执行。执行静态代码块后,执行实例代码块(构造块),然后执行构造函数。静态代码块可以在不实例化对象的情况下执行。匿名对象Anonymous只是指没有名字的对象。没有引用的对象称为匿名对象。匿名对象只能在创建对象时使用。如果一个对象只被使用一次,以后不需要再使用,可以考虑使用匿名对象classPersonthis.name=name;}publicvoidshow(){System.out.println("name:"+name+""+"age:"+age);}}publicclassMain{publicstaticvoidmain(String[]args){newPerson("caocao",19).show();//通过匿名对象调用方法}}//执行结果名称:caocaoage:19toStringmethod上面四个我们用到了show方法,其实,我们可以使用toString方法来实现:@Override//RewritepublicStringtoString(){return"Person{"+"name='"+name+'\''+",age="+age+'}';【注意】:toString方法会在println时自动调用。将对象转换为字符串的操作称为序列化。toString是Object类提供的方法。我们自己创建的Person类默认继承自Object类。我们可以重写toString方法来实现我们自己版本的转换字符串方法。@Override在Java中被称为“注解”,这里的@Override表示下面实现的toString方法重写了父类的方法。