Java作为一种面向对象的编程语言,支持以下基本概念:
1、类(Class):
2、对象(Object):
3、继承(Inheritance):
4、封装(Encapsulation):
privateStringname;publicStringgetName(){returnname;}5、多态(Polymorphism):
6、抽象(Abstraction):
7、接口(Interface):
8、方法(Method):
9、方法重载(MethodOverloading):
publicclassMathUtils{publicintadd(inta,intb){returna+b;}publicdoubleadd(doublea,doubleb){returna+b;}}本节我们重点研究对象和类的概念。
下图中男孩(boy)、女孩(girl)为类(class),而具体的每个人为该类的对象(object):
下图中汽车为类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。
现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
类可以看成是创建Java对象的模板。
通过上图创建一个简单的类来理解下Java中类的定义:
一个类可以包含以下类型变量:
一个类可以拥有多个方法,在上面的例子中:eat()、run()、sleep()和name()都是Dog类的方法。
每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:
下面是一个创建对象的例子:
编译并运行上面的程序,会打印出下面的结果:
小狗的名字是:tommy访问实例变量和方法通过已创建的对象来访问成员变量和成员方法,如下所示:
下面的例子展示如何访问实例变量和调用成员方法:
编译并运行上面的程序,产生如下结果:
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类
importjava.io.*;一个简单的例子在该例子中,我们创建两个类:Employee和EmployeeTest。
首先打开代码编辑器,把下面的代码粘贴进去,将文件保存为Employee.java。
Java程序都是从main方法开始执行,为了能运行这个程序,必须包含main方法并且创建一个实例对象。
下面给出EmployeeTest类,该类实例化2个Employee类的实例,并调用方法设置变量的值。
将下面的代码保存在EmployeeTest.java文件中。
编译这两个文件并且运行EmployeeTest类,可以看到如下结果:
190***276@qq.com
stinkaroo
LadyLeane
q-b***sn.com
package的作用就是c++的namespace的作用,防止名字相同的类产生冲突。Java编译器在编译时,直接根据package指定的信息直接将生成的class文件生成到对应目录下。如packageaaa.bbb.ccc编译器就将该.java文件下的各个类生成到./aaa/bbb/ccc/这个目录。
import是为了简化使用package之后的实例化的代码。假设./aaa/bbb/ccc/下的A类,假如没有import,实例化A类为:newaaa.bbb.ccc.A(),使用importaaa.bbb.ccc.A后,就可以直接使用newA()了,也就是编译器匹配并扩展了aaa.bbb.ccc.这串字符串。
阿弥托福哦
253***7490@qq.com
为什么JAVA文件中只能含有一个Public类
java程序是从一个public类的main函数开始执行的,(其实是main线程),就像C程序是从main()函数开始执行一样。只能有一个public类是为了给类装载器提供方便。一个public类只能定义在以它的类名为文件名的文件中。
每个编译单元(文件)都只有一个public类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public类,编译器就会报错。并且public类的名称必须与文件名相同(严格区分大小写)。当然一个编译单元内也可以没有public类。
pxn626
790***000@qq.com
成员变量和类变量的区别
由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。
不同的对象的实例变量将被分配不同的内存空间,如果类中的成员变量有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量。
成员变量和类变量的区别:
1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3、别名不同
成员变量也称为实例变量。
静态变量也称为类变量。
4、数据存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
static关键字,是一个修饰符,用于修饰成员(成员变量和成员函数)。
特点:
1、想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。
2、被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。
3、静态随着类的加载而加载。而且优先于对象存在。
弊端:
1、有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。
2、静态方法只能访问静态成员,不可以访问非静态成员。
因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。
3、静态方法中不能使用this,super关键字。
因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。
什么时候定义静态成员呢?或者说:定义成员时,到底需不需要被静态修饰呢?
成员分两种:
1、成员变量。(数据共享时静态化)
该成员变量的数据是否是所有对象都一样:
如果是,那么该变量需要被静态修饰,因为是共享的数据。
如果不是,那么就说这是对象的特有数据,要存储到对象中。
2、成员函数。(方法中没有调用特有数据时就定义成静态)
如果判断成员函数是否需要被静态修饰呢?
只要参考,该函数内是否访问了对象中的特有数据:
如果有访问特有数据,那方法不能被静态修饰。
如果没有访问过特有数据,那么这个方法需要被静态修饰。
成员变量和静态变量的区别:
1、成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。
2、成员变量存在于堆内存中。
静态变量存在于方法区中。
3、成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。
4、成员变量只能被对象所调用。
静态变量可以被对象调用,也可以被类名调用。
所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。
Demetris
150***67161@163.com
类变量类型:
publicclassClassName{publicvoidprintNumber(){inta;}//其他代码}2.成员变量:定义在类中,方法体之外。变量在创建对象时实例化。成员变量可被类中的方法、构造方法以及特定类的语句块访问。
ycxchkj
xch***163.com
类的构造方法
1、构造方法的名字和类名相同,并且没有返回值。
2、构造方法主要用于为类的对象定义初始化状态。
3、我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。
4、Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。
new关键字的作用
1、为对象分配内存空间。
2、引起对象构造方法的调用。
3、为对象返回一个引用。
Lynn
276***577@qq.com
Sometimes,youwanttohavevariablesthatarecommontoallobjects.Thisisaccomplishedwiththestaticmodifier.Fieldsthathavethestaticmodifierintheirdeclarationarecalledstaticfieldsorclassvariables.Theyareassociatedwiththeclass,ratherthanwithanyobject.
lllunaticer
tdl***tju.edu.cn
实例:
2333
135***8036@qq.com
2.初始值不同
成员变量如果没有赋值则是有默认值的,数据类型不同则默认值不同。
3.在一个类中,局部变量可以与成员变量同名,但是局部变量优先,如果非要访问成员变量的属性,则必须使用this.color
this代表当前这个对象,也就是当前谁调用这个方法则这个对象就是谁。
对象是具体的一个实例,如:newStudent();new表示创建一个对象,并在堆内存中开辟一块空间。
引用名称是存放的对象的地址。
tfbyly
905***717@qq.com
内部类:将一个类的定义放在另一个类的定义内部,这就是内部类。
如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)
显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类,而心脏又在人体当中,正如同是内部类在外部类当中。
1)不用内部类:
publicclassPerson{privateintblood;privateHeartheart;}publicclassHeart{privateintblood;publicvoidtest(){System.out.println(blood);}}2)使用内部类:
publicclassPerson{privateintblood;publicclassHeart{publicvoidtest(){System.out.println(blood);}}publicclassBrain{publicvoidtest(){System.out.println(blood);}}}内部类优点和缺点:
应用举例
//外部类classOut{privateintage=12;//内部类classIn{publicvoidprint(){System.out.println(age);}}}publicclassDemo{publicstaticvoidmain(String[]args){Out.Inin=newOut().newIn();in.print();//或者采用下种方式访问/*Outout=newOut();Out.Inin=out.newIn();in.print();*/}}运行结果:12
从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?
因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点。
如同心脏可以直接访问身体的血液,而不是通过医生来抽血。
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class。
其中$代表了上面程序中Out.In中的那个。
Out.Inin=newOut().newIn()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意:
更多详细内容可参考:
小宝呼呼
hua***aoling66@163.com
对构造函数对引用:
classPerson{publicstaticvoidprt(Strings){System.out.println(s);}Person(){prt("父类·无参数构造方法:"+"APerson.");}//构造方法(1)Person(Stringname){prt("父类·含一个参数的构造方法:"+"Aperson'snameis"+name);}//构造方法(2)}publicclassChineseextendsPerson{Chinese(){super();//调用父类构造方法(1)prt("子类·调用父类”无参数构造方法“:"+"Achinesecoder.");}Chinese(Stringname){super(name);//调用父类具有相同形参的构造方法(2)prt("子类·调用父类”含一个参数的构造方法“:"+"hisnameis"+name);}Chinese(Stringname,intage){this(name);//调用具有相同形参的构造方法(3)prt("子类:调用子类具有相同形参的构造方法:hisageis"+age);}publicstaticvoidmain(String[]args){Chinesecn=newChinese();cn=newChinese("codersai");cn=newChinese("codersai",18);}}运行结果:
samcyang
532***194@qq.com
JAVA和C++一样,若是不定义任何的构造函数,会自动构造;如果定义了任何一个构造函数,就不会再自动构造,需要自己定义全部的构造函数。
Phanio
pen***aw@163.com
错误:CMD编译Java源文件时出现的编码GBK的不可映射字符的错误。
办法:使用javac-encodingUTF-8.java指定编码形式。
原因:由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定JAVA源程序的编码格式,则java.exe首先获得我们才做系统默认采用的编码格式,也即在编译JAVA程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如win2k,他的值为GBK),然后JDK就把我们的JAVA源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放到内存中。之后,javac把转换后的UNICODE格式的文件进行编译成class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码编译后的.class文件保存到操作系统中形成我们见到的.class文件。但我们不加设置就编译时,相当于使用了参数:javac-encodinggbkxx.java,就会出现不兼容的情况。
Ekko404
283***6790@qq.com
类:
classA{}//最简单的类,没有任何属性和行为一个类可以包含以下类型变量:
一个类可以拥有多个方法,在上面的例子中:eat()、run()和sleep()等都是Dog类的方法。
创建对象:
对象:
Aobj=newA();Aobj1=A();Aobj2=newA();构造方法(构造函数)
在创建类的里面用:
public类名(){}public类名(Stringname){}访问实例变量和方法
通过已创建的对象来访问成员变量和成员方法,如下所示:
/*实例化对象*/ObjectreferenceVariable=newConstructor();/*访问类中的变量*/referenceVariable.variableName;/*访问类中的方法*/referenceVariable.methodName();类变量类型:
jidaojiuyou
232***1805@qq.com
简单说下类和对象。
以LOL为例。
首先,比如lol中的英雄,它就是一个类。因为所有的英雄都有对应的属性。例如:
publicclassHero{Stringname;//名字intattackDamage;//物理攻击intabilityPower;//法术强度intarmor;//护甲intmagicResistance;//魔抗floatattackSpeed;//攻击速度intcooldownReduction;//冷却缩减intcriticalStrike;//暴击率intmoveSpeed;//移动速度inthp;//血量intmp;//蓝量}除了属性,英雄还有行为。比如拆塔,坑队友,K头,跳舞等。
publicclassHero{publicvoidDestroyTower(){System.out.println("正在拆塔");}publicvoidKeng(){System.out.println("坑了一下队友");}publicvoidKb(){System.out.println("抢到了一个人头");}publicvoidDance(){System.out.println("正在跳舞");}}对象就是指具体的英雄,比如德玛(garen)。就可以在main方法中new一个对象。