向前吧,荡起生命之舟,不必依恋和信泊,破浪的船自会一路开放常新的花朵。
本讲内容:成员变量、方法、方法的重载、方法的覆盖、构造函数
一、成员变量(类或对象的状态)
(1)、认识成员变量、类变量、实例变量、局部变量、方法参数之间的区别
1、成员变量(field)是没有定义在代码块(包括初始化块、成员方法)中的变量。成员变量是类变量还是实例变量取决于在其声明中是否使用了static关键字。
2、类变量在声明是用了static关键字,它的另一个名字叫静态变量、静态成员变量(static field) 。
static的特点:
a、放在共享区的只有一份;
b、随着类的加载而被加载,优先于对象的存在;
c、除了可以被对象调用外,还可以被类名直接调用(类名.静态成员);
3、实例变量是在声明时没有使用static关键字的成员变量,它的另一个名字叫非静态成员变量(non-static field)。
4、定义在代码块里的变量被称为局部变量(local variable)。
5、定义在方法声明中的变量叫方法参数。
区别如下:
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">public class text {
static String s1 = "类变量";
String s2 = "实例变量";
{
String s3 = "初始化代码块里的局部变量";
}
static {
String s4 = "静态初始化代码块里的局部变量";
}
// <span style="font-family: Arial;">s5</span><span style="font-family: Arial;">方法的参数和方法里的局部变量</span>
public void printString(String s5) {
String s6 = "方法里的局部变量";
}
// 静态类方法(可以直接被类名所调用)
public static void printString() {
String s7 = "类方法里的局部变量";
System.out.println(s7);
}
public static void main(String[] args) {
text.printString(); //直接被类名所调用静态类方法
Lei08_1 a=new Lei08_1();//创建对象
a.printString("参数的值");//调用实例方法
}
}
</span></span></span>
(2)、变量的初始化
实例变量一经定义就会有初始值(默认的,第二讲讲到),局部变量定义时不赋初值而直接使用,编译器会报错
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">public class text {
int i;
{
int j;
System.out.println(j);<span style="font-family: Arial;">//会报错</span>
}
public static void main(String[] args) {
}
}</span></span></span></span>
二、方法(类或对象的行为)
Java中类的行为由类的成员方法来实现。类的成员方法由方法的声明和方法体两部分组成。
1、修饰符,可选,用于指定谁有权限访问此方法。
2、返回值类型,必选,用于指定该方法的返回值数据类型;如果该方法没有返回值,则要用关键字 void 进行标示。方法的返回值只能有一个。
3、参数列表,可以有0到多个,多个参数之间要用逗号隔开,参数的写法形如:String[] args, int age 这样。
4方法名,必选,命名规则是方法名和变量名的首字母要小写,不要弄个大写方法名出来。
5方法体,可选,
6、大括号,可选,大括号不写的方法叫抽象方法。
注意:属性和方法之间的关系
“状态影响行为,行为影响状态”。如果每个对象都是从同一个类中生成出来,每个对象如果都一摸一样,那么这个世界是不是太无趣了。我们看到上一讲的例子中,小狗的大小属性影响了他叫的方式。通过设置狗大小的方法又改变了它的状态。这些属性和方法的细节上的不同导致了,多姿多彩的对象,我们后面还会讲到更多的技术,也会导致更多的多样性。
三、方法重载 overload
在Java 中允许类定义中多个方法的方法名相同,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载(overloaded ),这种方式就叫做方法重载(method overloading )。方法重载是实现程序多样性的一个重要手段。也可以称作多态的一种表现方式。
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">class Num{
public void max(int a,int b){
System.out.println(a>b?a:b);
}
public void max(double a,double b){
System.out .println(a>b?a:b);
}
public void max (int a,int b,int c){
int max=a>b?a:b;
System.out.println(max>c?max:c);
}
}
public class L6 {
public static void main(String[] args) {
Num a=new Num();
a.max(45, 3);
a.max(3.2, 6.5);
a.max(8, 9, 2);
}
}</span></span></span></span>
上面的例子说明了参数的个数,类型和顺序任意一项不同就算不同的参数声明
四、方法的覆盖
1、子类有一个方法和父类某个方法的名称、返回类型、参数完全一样,那么我们就说子类的这个方法覆盖了父类的那个方法。
2、子类的方法的访问权限大于等于父类方法的权限。
五、构造函数(即构造方法)
1、构造方法与类名相同。
2、构造方法没有返回值。
3、主要作用是初始化类的成员属性(变量)。
4、在创建对象时,系统会自动的调用该类的构造方法。
5、一个类可以有多个构造方法。
6、每个类都有一个默认的构造方法(无参数的)。
在Java中,对象是构造出来的,特意用了一个new关键字来标示这个创建的过程。
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">class Lion{
private String name;
private int age;
public Lion() {
System.out.println("无参数构造方法");
}
public Lion(String name,int age){//有参数构造方法
this.name=name;
this.age=age;
System.out.println("姓名:"+name+"\t年龄:"+age);
}
}
public class L7 {
public static void main(String[] args) {
Lion a=new Lion();
Lion b=new Lion("黎开权", 20);
}
}</span></span></span></span>
我们看到创建对象的过程就是执行构造函数的过程,而且也看到构造方法也可以重载。注意:构造函数或者说构造方法,它不是方法。它们之间的三大区别
1、构造函数没有返回值
2、构造函数和类名相同
3、构造函数不能用final、static、abstract修饰
本讲就到这里,Take some time and enjoy it