竹笋

首页 » 问答 » 灌水 » 面向对象总结都是干货哟
TUhjnbcbe - 2024/6/14 19:17:00
刘军连出诊时间 https://wapjbk.39.net/yiyuanfengcai/ys_bjzkbdfyy/

我们接着上次的继续整理

面向对象:面向对象是把问题域分解成各个对象,建立对象的目的不是为了完成一个步骤,

而是为了描叙某个事物在整个解决问题的步骤中的行为

面向过程:面向过程就是分析出解决问题所需要的步骤,

然后用方法把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了

类的定义:

publicclassAnimal

{

publicintlegs;

publicvoideat(){

System.out.println(“Eating.”);

}

publicvoidmove(){

System.out.println(“Moving.”);

}

}

legs是类的属性,也叫类的成员变量。

eat,move是方法也叫类的成员方法。

声明类:

语法格式:

[修饰符]class类名

{

[属性声明]

[构造器声明]

[方法声明]

}

说明:修饰符public:类可以被任意访问

类的正文要用{}括起来

举例:

publicclassPerson{

privateintage;  //声明私有变量age

publicvoidshowAge(inti){//声明方法showAge

age=i;

}

}

属性声明:

语法格式:

[修饰符]类型属性名[=初值];

说明:修饰符private:该属性只能由该类的方法访问。

修饰符public:该属性可以被该类以外的方法访问。

类型:任何基本类型,如int、boolean或任何类。

举例:

publicclassPerson{

privateintage;//声明private变量age

publicStringname=“Lila”;//声明public变量name

}

声明方法:

语法格式:

修饰符返回类型方法名([参数表]){

[语句]

}

说明:修饰符:public,private,protected等。

返回类型:return语句传递返回值。没有返回值:void。

举例:

publicclassPerson{

privateintage;

publicintgetAge(){

returnage;

}//声明方法getAge

publicvoidsetAge(inti){//声明方法setAge

age=i;//将参数i的值赋给类的成员变量age

}

}

类的访问机制:

在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(有一个例外)

在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。

匿名对象:

我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象,如:newPerson().shout();

如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。

我们经常将匿名对象作为实参传递给一个方法调用。

方法

返回值类型方法名(参数类型形式参数1,参数类型形式参数2,….){

程序代码

return返回值;

其中:

形式参数:在方法被调用时用于接收外部传入的数据的变量。

参数类型:就是该形式参数的数据类型。

返回值:方法在执行完毕后返还给调用它的程序的数据。

返回值类型:方法要返回的结果的数据类型。

实参:调用方法时实际传给方法形式参数的数据。

方法的重载

方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要它们的参数个数或类型不同即可。如:

publicclassTest

{

publicstaticvoidmain(String[]args){

intisum;

doublefsum;

isum=add(3,5);

isum=add(3,5,6);

fsum=add(3.2,6.5);

}

publicstaticintadd(intx,inty){

reutrnx+y;

}

publicstaticintadd(intx,inty,intz){

returnx+y+z;

}

publicstaticdoubleadd(doublex,doubley){

returnx+y;

}

}

final:

在Java中声明类、属性和方法时,可使用关键字final来修饰。

final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。

final标记的类不能被继承。提高安全性,提高程序的可读性。

final标记的方法不能被子类重写。增加安全性。

final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。

举例:

publicfinalclassTest{

publicstaticinttotalNumber=5;

publicfinalintid;

publicTest(){

id=++totalNumber;//只能在构造方法中给final变量赋值

}

publicstaticvoidmain(String[]args){

Testt=newTest();

System.out.println(t.id);

finalinti=10;

finalintj;

j=20;

j=30;//非法

}

static:

在Java类中声明变量、方法和内部类时,可使用关键字static做为修饰符。

static标记的变量或方法由整个类(所有实例)共享,如访问控制权限允许,可不必创建该类对象而直接用类名加‘.’调用。

static成员也称类成员或静态成员,如:类变量、类方法、静态方法等。

classCircle

{

privatedoubleradius;

publicCircle(doubleradius){this.radius=radius;}

publicdoublefindArea(){returnMath.PI*radius*radius;}

}

创建两个Circle对象

Circlec1=newCircle(2.0);  //c1.radius=2.0

Circlec2=newCircle(3.0);  //c2.radius=3.0

Circle类中的变量radius是一个实例变量(instancevariable),它属于类的每一个对象,不能被同一个类的不同对象所共享。

上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。

如果想让一个类的所有实例共享数据,请用类变量

类变量:类变量(类属性)由该类的所有实例共享

publicclassPerson{

privateintid;

publicstaticinttotal=0;

publicPerson(){

total++;

id=total;

}

}

类属性类似于全局变量

类属性的应用举例

classPerson{

privateintid;

publicstaticinttotal=0;

publicPerson(){

total++;

id=total;

}

publicstaticvoidmain(Stringargs[]){

PersonTom=newPerson()

Tom.id=0;

total=;//不用创建对象就可以访问静态成员

}

}

publicclassOtherClass{

publicstaticvoidmain(Stringargs[]){

Person.total=;//不用创建对象就可以访问静态成员

//访问方式:类名.类属性类名.类方法

System.out.println(Person.total);

Personc=newPerson();

System.out.println(c.total);  //输出

}

}

类方法

没有对象的实例时,可以用类名.方法名()的形式访问由static标记的类方法。

classPerson{

privateintid;

privatestaticinttotal=0;

publicstaticintgetTotalPerson(){

returntotal;

}

publicPerson(){

total++;

id=total;

}

}

publicclassTestPerson{

publicstaticvoidmain(String[]args){

System.out.println(Numberoftotalis+Person.getTotalPerson());

//没有创建对象也可以访问静态方法

Personp1=newPerson();

System.out.println(Numberoftotalis+Person.getTotalPerson());

}

}

在static方法内部只能访问类的static属性,不能访问类的非static属性。

classPerson{

privateintid;

privatestaticinttotal=0;

publicstaticintgetTotalPerson(){

id++;  //非法

returntotal;

}

publicPerson(){

total++;

id=total;

}

}

因为不需要实例就可以访问static方法,因此static方法内部不能有this,(也不能有super?)

classPerson{

privateintid;

privatestaticinttotal=0;

publicstaticvoidsetTotalPerson(inttotal){

this.total=total;//非法,在static方法中不能有this,也不能有super

}

publicPerson(){

total++;

id=total;

}

}

publicclassTestPerson{

publicstaticvoidmain(String[]args){

Person.setTotalPerson();

}

}

在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

静态方法不能以任何方式引用this和super关键字。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。

main()方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。

类属性,类方法的设计思想:

类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。

如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用

练习1:编写一个类,实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,定义封装这些

属性的方法。账号要自动生成。

编写主类,使用银行账户类,输入、输出3个储户的上述信息。

考虑:哪些属性可以设计成static属性。Bank.java

静态块

一个类中可以使用不包含在任何方法体中的静态代码块(staticblock),当类被载入时,静态代码块被执行,且只被执行一次,静态块经常用来进行类属性的初始化。

static块通常用于初始化static(类)属性

classPerson{

publicstaticinttotal;

static{

total=;//为total赋初值

}

……//其它属性或方法声明

}

静态块举例

classPerson{

publicstaticinttotal;

static{

total=;

System.out.println(instaticblock!);

}

}

publicclassTest{

publicstaticvoidmain(String[]args){

System.out.println(total=+Person.total);

System.out.println(total=+Person.total);

}

}

输出:

instaticblock

total=

total=

单子Singleton设计模板:

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就想是经典的棋谱,不同的棋局,我们用不同的棋谱,免得我们自己再去思考和摸索。

所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

classSingle{

privatestaticSingleonlyone=newSingle();//私有的,只能在类的内部访问

privateStringname;

publicstaticSinglegetSingle(){//getSingle()为static,不用创建对象

//即可访问

returnonlyone;

}

privateSingle(){}//private的构造器,不能在类的外部创建该类的对象

}

publicclassTestSingle{

publicstaticvoidmain(Stringargs[]){

Singles1=Single.getSingle();//访问静态方法

Singles2=Single.getSingle();

if(s1==s2){

System.out.println(s1isequalstos2!);

}

}

}

理解main方法的语法:

由于java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因为java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数。

命令行参数用法举例

publicclassCommandPara{

publicstaticvoidmain(String[]args){

for(inti=0;iargs.length;i++){

System.out.println(args[+i+]=+args);

}

}

}

//运行程序CommandPara.java

javaCommandParalisabilyMrBrown

//输出结果:

args[0]=lisa

args[1]=bily

args[2]=MrBrown

抽象类(abstractclass):

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。

抽象方法:只有方法的声明,没有方法的实现。以分号结束。

abstractintabstractMethod1(inta);

含有抽象方法的类必须被声明为抽象类。

抽象类不能被实例化。抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。

不能用abstract修饰私有方法,构造方法,静态方法。

抽象类举例

abstractclassA{

abstractvoidm1();

publicvoidm2(){

System.out.println(A类中定义的m2方法);

}

}

classBextendsA{

voidm1(){

System.out.println(B类中定义的m1方法);

}

}

publicclassTest{

publicstaticvoidmain(Stringargs[]){

Ac=newB();

c.m1();

c.m2();

}

}

抽象类应用:

抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。

在航运公司系统中,Vehicle类需要定义两个方法分别计算运输工具的燃料效率和行驶距离。

问题:卡车(Truck)和驳船(RiverBarge)的燃料效率和行驶距离的计算方法完全不同。Vehicle类不能提供计算方法,但子类可以。

解决方案:

Java允许类设计者指定:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类。

Vehicle是一个抽象类,有两个抽象方法。

publicabstractclassVehicle{

publicabstractdoublecalcFuelEfficiency();  //计算燃料效率的抽象方法

publicabstractdoublecalcTripDistance();  //计算行驶距离的抽象方法

}

publicclassTruckextendsVehicle{

publicdoublecalcFuelEfficiency(){//写出计算卡车的燃料效率的具体方法}

publicdoublecalcTripDistance(){//写出计算卡车行驶距离的具体方法}

}

publicclassRiverBargeextendsVehicle{

publicdoublecalcFuelEfficiency(){//写出计算驳船的燃料效率的具体方法}

publicdoublecalcTripDistance(){//写出计算驳船行驶距离的具体方法}

}

注意:抽象类不能实例化newVihicle()是非法

接口:

有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。

接口(interface)是抽象方法和常量值的定义的集合。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

接口定义举例

publicinterfaceRunner{

intid=1;

publicvoidstart();

publicvoidrun();

publicvoidstop();

}

接口的特点:

用interface来定义。

接口中的所有成员变量都默认是由publicstaticfinal修饰的。

接口中的所有方法都默认是由publicabstract修饰的。接口没有构造方法。

实现接口的类中必须提供接口中所有方法的具体实现内容。

多个无关的类可以实现同一个接口

一个类可以实现多个无关的接口

与继承关系类似,接口与实现类之间存在多态性

接口也可以继承另一个接口,使用extends关键字。

实现接口的类中必须提供接口中所有方法的具体实现内容。

多个无关的类可以实现同一个接口

一个类可以实现多个无关的接口

与继承关系类似,接口与实现类之间存在多态性

定义Java类的语法格式:

modifierclassname[extendssuperclass]

[implementsinterface[,interface]*]{

declarations*

}

接口应用举例:

publicinterfaceRunner{

publicvoidstart();

publicvoidrun();

publicvoidstop();

}

publicclassPersonimplementsRunner{

publicvoidstart(){

//准备工作:弯腰、蹬腿、咬牙、瞪眼  //开跑

}

publicvoidrun(){

//摆动手臂

//维持直线方向

}

publicvoidstop(){

//减速直至停止、喝水。

}

}

一个类可以实现多个无关的接口

interfaceRunner{publicvoidrun();}

interfaceSwimmer{publicdoubleswim();}

classAnimal{publicinteat(){…}}

classPersonextendsAnimalimplementsRunner,Swimmer{

publicvoidrun(){……}

publicdoubleswim(){……}

publicinteat(){……}

}

与继承关系类似,接口与实现类之间存在多态性

publicclassTest{

publicstaticvoidmain(Stringargs[]){

Testt=newTest();

Personp=newPerson();

t.m1(p);

t.m2(p);

t.m3(p);

}

publicStringm1(Runnerf){f.run();}

publicvoidm2(Swimmers){s.swim();}

publicvoidm3(Animala){a.eat();}

}

接口的其他问题

如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类。

接口也可以继承另一个接口,使用extends关键字。

interfaceMyInterface

{

Strings=“MyInterface”;

publicvoidabsM1();

}

interfaceSubInterfaceextendsMyInterface

{

publicvoidabsM2();

}

publicclassSubAdapterimplementsSubInterface

{

publicvoidabsM1(){System.out.println(“absM1”);}

publicvoidabsM2(){System.out.println(“absM2”);}

}

实现类SubAdapter必须给出接口SubInterface以及父接口MyInterface中所有方法的实现。

小编先整理这么多,求感兴趣的同学多多

1
查看完整版本: 面向对象总结都是干货哟