java中的实例⽅法、类⽅法和构造⽅法
⾸先,明确什么是实例变量、类变量、局部变量
在java语⾔中,变量分为局部变量和成员变量⼤类。
**成员变量(实例变量、类变量)**是指在类体内且在⽅法体外定义的变量,其作⽤域是整个类。
局部变量是指在⽅法体内声明的变量,其作⽤域是从声明处开始⾄它所在的最⼩块的语句结束处,另外,⽅法中的形参、for语句中定义的循环变量也都是属于局部变量。
1.实例变量:在类体内且在⽅法体外定义的变量,且变量名前⾯没有static修饰符;
2.类变量:在类体内且在⽅法体外定义的变量,且在变量名前⾯有static修饰符
3.局部变量:在⽅法体内或块定义的变量,变量名前⾯只能⽤final修饰符或没有修饰符;
举个例⼦:
class Circle{
static int total{ //类变量
double radius; //实例变量
void print(){
int var_number = 0; //局部变量
}
}
⼀.成员⽅法
1、成员⽅法声明的⼀般格式是:
[可访问性修饰符][abstract] [final][native][synchronize ][static] 返回值类型 ⽅法名 (形参表) [throws 异常类名表] {…//⽅法体}
上述⽅括号括起来的部分,表⽰是可选项,其含义分别如下:
1>修饰符
a、可访问性修饰符的含义与成员变量可访问性修饰符的含义相同
b、⽤abstract修饰的⽅法称为抽象⽅法,抽象⽅法只提供⽅法名、形参表和返回值类型,没有⽅法体⽗⽅法,或者说⽅法体只有⼀个分好
c、被static 修饰的⽅法称为类⽅法(或静态⽅法),⽽没有被static修饰的⽅法称为实例⽅法
d、⽤final修饰的⽅法称为最终⽅法,最终⽅法不能在⼦类中被覆盖,最终⽅法不能被abstract修饰,private⽅法和final类中的所有⽅法都隐藏final性质。
e、⽤native修饰的⽅法称之为本地⽅法
f、⽤synchronized修饰的⽅法称为同步⽅法,⽤于保证多线程之间的同步
2>返回值类型
返回类型是指⽅法返回值的类型,返回值类型可以是下列三种类型中的⼀种: 基本类型、引⽤类型、void类型,指明该种⽅法没有返回值,如果返回值类型不是void,则⽅法体中必须包含带表达式的return语句,语句返回的数据类型要与⽅法的返回类型相同,即:
a 、 对基本类型,实际返回类型要与指定的返回类型相同,或者能够赋值转换成指定返回类型
b、 对引⽤类型(类),实际返回类型要与指定的类型相同(同⼀个类),或者是指定返回类型的⼀个⼦类
3>形参表
<;形参表>;形参可有可⽆
a 、若有形参:各参数之间⽤逗号隔开,每个参数包括类型和名字,⽅法形参被看成是局部变量,其作⽤域是整个⽅法体
b 、⽅法在调⽤时,实参与形参的数⽬要相同,类型要相容
c 、实参与形参之间的传递的规则:基本类型,按值传递;引⽤类型,按引⽤传递
4> ⽅法体
对抽象⽅法和本地⽅法,⽅法体为分号。在其他情况下,⽅法体是块语句,即所有的⽅法代码放置在⼀对⼤括号⾥⾯,⽅法代码决定了⽅法的具体⾏为,java语⾔允许⼀个类中定义多个⽅法,⽅法定义形式为并列形式,先后顺序⽆关紧要
⼆、实例⽅法和类⽅法
被static修饰的⽅法称为类⽅法(或静态⽅法),⽽没有被static修饰的⽅法称为实例⽅法
在使⽤类⽅法和实例⽅法的时候要注意以下⼏点:
1>调⽤⽅式不同
实例⽅法属于实例,必须通过实例调⽤;
类⽅法属于类,⼀般通过类名调⽤,也可以通过实例调⽤
具体⽅法调⽤格式:
⽅法调⽤代码与被调⽤⽅法在同⼀个类中,:⽅法名([ 实参表])实例化类和实例化对象
⽅法调⽤代码与被调⽤⽅法在同⼀个类中,:⽅法名([ 实参表])
⽅法调⽤代码与被调⽤⽅法不在同⼀个类中:对象引⽤,⽅法名([实参表])
⽅法调⽤代码与被调⽤⽅法不在同⼀个类中:类名,⽅法名([实参表])
2>访问的成员不同
实例⽅法可以直接访问该类的实例变量和实例⽅法,也可以访问类变量和类⽅法
类⽅法只能访问该类的类变量和类⽅法,不能直接访问实例变量和实例⽅法
例:
class StaticError{
String mystring = “hello”;
public static void main (String args [ ]){
System.out.println(mystring )
}
}
编译时出现错误:nonstatic varible mystring cannot be referenced form a static context “System.out.println (mystring);”。
分析与思考:编译错误原因是因为类⽅法不能直接访问实例的变量,解决的办法是将实例变量mystring改成类变量 static String =“hello”;
类⽅法要访问实例变量或调⽤实例⽅法,⾸先先获得该实例的引⽤值,然后通过该引⽤值访问实例变量或者是实例⽅法,引⽤值也可以由类⽅法⾃⼰创建,也可以通过参数传递获得:
class NoStaticError{
String mystring = “hello”;
public static void main (String args [ ]) {
NoStaticError obj = new NoStaticError();
Syatem.out.string);
}
}
分析与思考:先在main()⽅法中创建No StaticError的类的实例,并将实例的引⽤值赋给变量obj访问实
例变量mystring
实例⽅法也可以直接访问当前的对象的实例变量和实例⽅法,也可以访问类变量和类⽅法
例:
Circle 类的⼀个实例变量radius ,CircleTest类中有程序段如下:
Circle object= new Circle(); //圆类对象obj的创建及初始化
objec.radius = 10; //obj成员变量radius的引⽤
System.out.println("Area = "+ Area());
该段程序有⼀个隐含的的问题:如果obj.radius = 10;改为obj.radius= -10;程序虽然能执⾏,但是,半径为负数是不合理的,造成这种情况的的原因是:其他应⽤的程序能直接访问对象的radius,却不能保证radius 的数值在合理的范围之内;
⼀般来说,把实例变量声明为private(只能被这个类的成员访问,在类外看不见),向外提供get⽅法及set⽅法访问该实例变量,通过这种策略,避免类外代码直接操作实例变量,即相对于类外代码⽽⾔,实例变量隐藏了起来(看不见),⽆法直接操作。
get⽅法的功能是取得成员变量的值,为了便于记忆和阅读,get⽅法名“get ”开头,后接的是成员变量的名字,get⽅法的格式如下:
pubic 类型 get 成员变量名()
return 成员变量;
}
set ⽅法的功能是修改成员变量的值,为了便于记忆和阅读,set⽅法以“set”开头,后接的是成员变量的名字,set⽅法的格式如下:
public void set 成员变量名 (成员变量类型 参数名){
成员变量 = 参数名;
例:
class Circle{
private double radius ;
//成员⽅法:设置圆的半径,输⼊的r为负数时,半径为0
public void setRadiud(double r){
if(r <0){
radius = 0;
}else{
radius = r ;
}
}
//成员⽅法:得到圆的半径
public double getRadius(){
return radius;
}
public double getArea(){
return radiud* radius* redius Math.PI;
}
public double getperimter(){
return 2radius * Math.PI;
}
}class Ex4{
public static void main (String args [ ]){
Circle obj = new Circle( );
obj.setRadius(-10); //调⽤set⽅法设置实例变量radius的值
System.out.println("Area = "+obj.Area());
System.out.println(“Perimter=”+ perimter());
}
}
程序运⾏结果:
Area = 0.0
perimter = 0.0
分析与思考:当设置半径为负数时,set⽅法避免了错误发⽣
三、构造⽅法
构造⽅法是⼀个与类同名的⽅法,对象创建的过程就是通过构造⽅法完成的,每当类实例化⼀个对象的时,类都会⾃动的调⽤构造⽅法特点:
构造⽅法没有返回值
构造⽅法的名称要与本类的名称相同
注意:在定义构造⽅法时,构造⽅法没有返回值,但这与普通没有返回值的⽅法不同,普通没有返回值的⽅法使⽤public void method Ex()这种⽅法定义,但构造⽅法并不需要void关键字修饰
构造⽅法的定义语法如下:
public book() {
//、、、构造⽅法体
}
public :构造⽅法修饰符
book: 构造⽅法的名称
在构造⽅法中可以为成员变量赋值,这样当实例化⼀个本类的对象时,相应的的成员变量也将被初始化
如果类中没有明确的定义构造⽅法,编译器会⾃动的创建⼀个不带参数的默认的构造⽅法
注意:如果在类中定义的构造⽅法都不是⽆参的构造的⽅法,你们编译器也不会设置⼀个默认的⽆参构造⽅法,当试图调⽤⽆参的构造⽅法实例化⼀个对象时,编译器就会报错,所以只有在类中没有定义任何构造⽅法时,编译器才会在该类中⾃动的创建⼀个不带参数的构造⽅法
this调⽤类中的构造⽅法:
public class AnyThing{
public AnyThing(){ //定义⽆参构造⽅法
this (“this调⽤有参构造⽅法“); //使⽤this调⽤有参构造⽅法
}
public AnyThing(String name) { //定义有参构造⽅法
System.out.println(“有参构造⽅法”);
}
}
注意:在⽆参的构造⽅法中使⽤this关键字调⽤有参的构造⽅法,但这种⽅式需要注意的是只可以在⽆参构造⽅法中第⼀句使⽤this调
⽤有参构造⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论