方法调用:
同类中,类的不同成员方法之间可以互相调用,调用时直接使用成员方法名称,其他类调用必须先创建这个类的对象,然后通过操作符.来调用这个类的成员方法。例如:
public class Test5 {
public String color(){
return "黄色";
}
public void lion(){
//同类中直接调用,调用时直接使用成员方法名称
System.out.print("这是一个"+color()+"的狮子");
}
}
public class test6 {
public static void main(String[] args) {
//其他类调用时先要创建这个类的对象
Test5 t=new Test5();
//通过操作符.来调用这个类的成员方法
t.lion();
}
}
常见错误:
return只能返回一个值,不能返回多个值
多个方法不能相互嵌套定义
不能在方法内部直接写逻辑代码
void不能用return语句
成员变量&局部变量:
成员变量:类中定义的变量称为类的成员变量,类的方法可以直接引用成员变量,不同类引用要通过创建类的对象,然后通过操作符.来引用。成员变量未赋值系统会自动给其默认初始值。
局部变量:在方法中定义的变量称为局部变量,作用域仅仅在该变量的方法内。局部变量必须手动赋初始值。
注意:
1不同方法中局部变量可以同名。
2局部变量可以和成员变量同名,并且优先级高于成员变量。
3循环结构中定义的变量作用域仅在控制流语句块中。
构造方法
构造方法是一个特殊的方法,方法名与类名同名,没有返回值类型,主要作用是在创建类的对象时执行一些初始化操作。当没有该方法时系统会提供一个空的该方法。(注:一旦自定义了构造方法,系统将不再提供这个默认构造方法,如要使用需自行添加)
public class Test6 {
private int a;
//无参构造
public Test6() {
super();
// TODO Auto-generated constructor stub
}
//有参构造
public Test6(int a) {
super();
this.a = a;
}
}
方法的重载
同一个类中的两个方法,方法名相同,参数个数或参数类型不同,则称该方法被重载了。成员方法和构造方法都能重载。
(注:与方法返回值和方法修饰符(private,public等)无关。方法的返回类型、修饰符可以相同,也可不同。)
public class Test5 {
public int lion(int i){
return i;
}
//方法修饰符不同返回值类型也不同,但是只要参数不同,仍然是重载
private boolean lion(){
return false;
}
}
Static修饰符
可以用来修饰属性,方法,和代码块。
Static修饰的属性称为类属性(类变量),修饰的方法称为类方法,不使用Static修饰的属性和方法称为实例属性(实例变量)和实例方法。
修饰变量:
当一个变量前面有了static这个修饰符,内存会为它分配唯一的一块存储空间。程序跑起来的时候,变量就存在在内存里了。谁要用它,就去访问一下它所在的内存。假如内存是澡堂子,static变量就像一坨肥皂,一整个澡堂子的人都共用之。不管澡堂子里有没有人,肥皂总是在这里。编译器想拿出肥皂来玩一玩,直接吼出肥皂的名字就好了。(即不需new对象,直接可以拿来用)
如果这是一个非static的变量,则是对每个对象有一份存储空间。程序跑刚起来的时候,是没有这个变量的。相当于一个澡堂子里每个人都有一坨肥皂。如果没有人,也就没有肥皂。编译器想要用肥皂来做点什么,必须先制造一个手持肥皂的人。(即必须new一个对象出来)
public class XX{
final static double PI = 3.14;
final double E=2.71;
public static void main(String[] args) {
//下面要使用static变量PI了
System.out.print(PI);//直接引用无需新建对象
//下面要使用非static变量E
XX b = new XX();
System.out.print(b.E);//要用new出的对象b引用
}
}
修饰方法:
假如一个方法被static修饰,可直接访问。不被static修饰,就需要用对象来访问。
public class XX{
public static void method1(){ }
public void method2(){ }
public static void main(String[] args)
{ //直接访问
method1();
XX b = new XX();
//通过新建的对象b来访问
b.method2();
}
}
修饰代码块:
static{ … … }
静态块、非静态块和构造函数出现的先后顺序
public class XX{
/**
* 运行结果:
* 这是static修饰的代码块
这是无static修饰的代码块
这是无参构造方法
这是普通实例方法
这是无static修饰的代码块
这是无参构造方法
这是普通实例方法
*/
public XX() {
System.out.println("这是无参构造方法");
}
{
System.out.println("这是无static修饰的代码块");
}
static{
System.out.println("这是static修饰的代码块");
}
public void method(){
System.out.println("这是普通实例方法");
}
public static void main(String[] args) {
//对象1的方法
XX x1=new XX();
x1.method();
//对象2的方法
XX x2=new XX();
x2.method();
}
}
结论: 静态代码块——非静态代码块——构造方法——普通方法,按照这个顺序执行,其中,静态块的加载是在main()函数以前的,并且只执行一次 ,非静态块和构造函数则是new一次执行一次。
静态导入:
使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
静态导入的语法是:
import static 包名.类名.静态成员变量;
import static 包名.类名.静态成员函数;
package com.example.learnjava;
public class Common
{
public static final int AGE = 10;
public static void output()
{
System.out.println("Hello World!");
}
}
在另一个包中使用时,如果不用静态导入,是这样用的:
package com.example.learnjava2;
import com.example.learnjava.Common;
public class StaticImportTest
{
public static void main(String[] args)
{
int a = Common.AGE;
System.out.println(a);
Common.output();
}
}
如前面的程序使用静态导入后:
package com.example.learnjava2;
//导入属性只需要写属性名即可
import static com.example.learnjava.Common.AGE;
//导入方法只需要写方法名即可,不需要加();
import static com.example.learnjava.Common.output;
public class StaticImportTest
{
public static void main(String[] args)
{
//直接引用属性名
int a = AGE;
System.out.println(a);
//直接引用方法名
output();
}
}
Static需要注意的点:
1.类方法只能访问类属性和其他类方法
2.静态方法中不能使用 this和super关键字
3.方法中不可以定义static变量,即类变量不能是局部变量。