java构造器和方法_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(String)

}

}

编译时出现错误: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.println(obj.mystring);

}

}

分析与思考:先在main()方法中创建No

StaticError的类的实例,并将实例的引用值赋给变量obj访问实例变量mystring 实例方法也可以直接访问当前的对象的实例变量和实例方法,也可以访问类变量和类方法 例:

​Circle 类的一个实例变量radius

,CircleTest类中有程序段如下:

Circle object= new

Circle();

//圆类对象obj的创建及初始化

objec.radius = 10;

//obj成员变量radius的引用

System.out.println(“Area

= “+ obj.get.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 2*radius *

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=”+

obj.getperimter());

}

}

程序运行结果: 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调用有参构造方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值