你的位置:首页 > Java教程

[Java教程]java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)


java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

作者:王可利(Star·星星)

 

匿名函数

匿名对象:没有名字的对象

 

匿名对象使用的注意点:

1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象。

2.匿名对象永远都不可能是一个对象。

如:person new().name = “星星”;是不行的

 

匿名对象的好处:书写简单。

匿名对象使用的场景:
1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.
2.可以作为实际参数在方法中调用


 

构造方法
Object-C 中自定义初始化方法:创建对象的时候 init 就调用这些方法;
1.可以在对象创建的时候初始化属性值。
2.创建对象的时候 只调用了一次方法。



java 中 ,这个方法叫构造方法

构造方法的作用:给对象进行初始化,对象创建时初始化属性值。

 

创建构造方法:

1.构造方法没有返回类型,方法名和类名保持一致。

2.构造方法不是我们手动调用的,是对象被创建的时候jvm(java虚拟机)调用的。

3.如果一个类我们没有给它定义构造方法,jvm(java虚拟机)在编译的时候 会给这个类默认添加一个无参构造方法。

4.如果自己定义了构造方法,那么jvm不会再创建无参构造方法。

5.创建对象的时候,有几个参数,就要有相应的构造方法,也是对应的要有几个参数。

格式:

    1.修饰符 类名(参数列表){}

    2.直接类名 (参数列表){}

代码如下 

 1 class Person{ 2   //公有属性 3   String name; 4   int age; 5    6   //创建一个构造方法(有两个参数) 7   public Person(String n,int a){ 8     name = n; 9     age = a;10   }11   //无参构造方法12   public Person(){13     14   }15   16   //行为17   public void study(){18     System.out.println(age+"岁的"+name+"正在学习");19   }20 }21 public class Star_gzff {22   23   public static void main(String[] args) {24     //创建一个Person对象25     Person p = new Person("星星",12);//这里传的是两个参数的那个构造方法26     //调用普通的方法-工作27     p.study();28     29     //没有无参构造方法这里会出错30     Person p1 = new Person();//这里传的是无参数的构造方法31     p1.name = "小明";32     p1.study();33   }34 }


 

方法重载

java中,方法是可以重名的,我们把这种重名的方法叫 方法的重载。

使用方法重载注意的地方:

1.方法名一样才叫方法重载。

2.任何方法(普通方法,构造方法)都可以实现方法重载。

3.参数列表要保证顺序 或者 个数是不一样的。

  如 :Person (String a , int b);

         Person ( int b, String a);//顺序不一样

         Person (String a , int b,String c);//个数不一样


 

构造代码块

代码块分为三类:

 

1.构造代码块

 

2.局部代码块:写在方法中,也是以大括号来表示

 

3.静态代码块

 

在上面的构造方法中,构造方法是可以调用普通方法的,在创建对象的同时就使用这个普通方法,不需要后期对象再调用方法。

如:

      public Person(String n,int a){
                 name = n;
                 age = a;
                 study();//调用普通的方法
      }

如果我们有很多的这样的构造方法(无参的,一个参数的,两个参数的...),每一个都要调用这个方法,代码就会显得复杂麻烦,于是就有了构造代码块。

代码块作用:给对象统一初始化。(对象创建之前都会走这个方法)

构造代码块的格式:{} 就一个大括号。。

代码分析:

 1 class Person{ 2   //公共属性 3   String name; 4  5   //构造代码块 6   { 7     age = 18; 8   } 9   //创建一个构造方法10   public Person(String n,int a){11     name = n;12     age = a;13   }14   15   int age = 20;16   17   public void study(){18     19     System.out.println(age+"岁的"+name+"在学习");20   }21 }22 23 public class Star_gzdmk {24   25   public static void main(String[] args) {26     27     Person p = new Person("星星",12);28     p.study();29   }30 }

构造代码块使用注意点总结:

1.构造代码块必须写在成员变量(属性)的位置。

2.对象创建之前都会走这个方法。

3.java中编译器编译java源文件的时候,会把成员变量的声明放到最前面。

4.成员变量的初始化都是在构造方法中执行的,一旦经过java编译器编译,构造代码块的方法会移到构造函数中执行,放在构造函数的最前面执行。

5.如果没有构造方法,只有成员变量初始化和构造代码块,按照当前代码的顺序来执行。

在普通方法里面,如果添加一个局部变量,名字和属性的名字一样的话:

System.out.println(name),这里的那么就是 局部变量的 name。

如果用了this关键字的话,System.out.println(this.name);就是构造方法里面的name。

在构造方法里面,传入的参数名字和属性的名字一样的话:如:name = name;//拿到的两个name都是局部变量

这时要写 this.name = name;//拿到的第一个name才是属性

this关键字:

    1.代表所属方法的调用对象,和oc中的 self 相似。

    2.如果成员变量和局部变量重名,在方法中的默认调用局部变量(就近原则),通过this可以让方法的调用成员变量。

    3.如果方法中不存在与成员变量重名的局部变量,java编译器就会默认给变量前面加一个this。


 

构造方法中调用构造方法

构造方法是可以调用普通方法(实例方法)。

构造方法中也是可以调用构造方法的。

问题代码如下:

class Student{  //公有属性  String id;  String name;  String classNum;  String sex;  int age;  //创建构造方法  public Student(String id,String name,String classNum,String sex,int age){    this.name = name;    this.id =id;    this.classNum = classNum;    this.sex = sex;    this.age = age;  }  //重载构造方法,只写四个参数的  public Student(String id,String name,String classNum,String sex){    this.name = name;    this.id =id;    this.classNum = classNum;    this.sex = sex;  }  //重载构造方法,只写三个参数的  public Student(String id,String name,String classNum){    this.name = name;    this.id =id;    this.classNum = classNum;  }  //普通方法  public void Student(){      }}

这样子写代码的话就会显得代码很复杂,我们在这个时候就可以尝试使用构造方法之间的调用。

比方说:4个参数的构造方法包含了3个参数的构造方法,我只需要在四个参数的构造方法里面调用3个参数的构造方法,在从中添加一个自己与三个参数不同的一个参数就可以简化代码了。

解决第一步的代码如下:

 

class Student{  //公有属性  String id;  String name;  String classNum;  String sex;  int age;  //创建构造方法  public Student(String id,String name,String classNum,String sex,int age){    Student(id,name,classNum,sex);//四个参数    this.age = age;  }  //重载构造方法,只写四个参数的  public Student(String id,String name,String classNum,String sex){    Student(id,name,classNum);//三个参数    this.sex = sex;  }  //重载构造方法,只写三个参数的  public Student(String id,String name,String classNum){    this.name = name;    this.id =id;    this.classNum = classNum;  }  //普通方法  public void Student(){      }}

 

但是如果你这样子调用的话会出现一个问题,你调用的不是构造方法,而是普通方法。

总结:直接使用方法名来调用方法,调用的是普通方法,不会是构造方法。

最后的解决方法,代码如下:

 

class Student{  //公有属性  String id;  String name;  String classNum;  String sex;  int age;  //创建构造方法  public Student(String id,String name,String classNum,String sex,int age){    this(id,name,classNum,sex);    this.age = age;  }  //重载构造方法,只写四个参数的  public Student(String id,String name,String classNum,String sex){    this(id,name,classNum);    this.sex = sex;  }  //重载构造方法,只写三个参数的  public Student(String id,String name,String classNum){    this.name = name;    this.id =id;    this.classNum = classNum;  }  //普通方法  public void Student(){      }}

 

构造方法调用的总结:

1.直接使用方法名来调用方法 调用的是普通的方法,不会将这个方法作为构造方法。

   如:Student(name,id,classNum,sex);

2.如果在方法名前面添加this ,也是错误的。

   如:this,Student(name,id,classNum,sex);

3.正确的调用方法应该是直接一个this()来调用构造方法。而且要是第一个语句,否则会报错。

   如:this(name,id,classNum,sex);

         this.id = id;

4.不要在两个构造方法之间相互调用构造方法。会导致死循环。

    如:this(name,id,classNum,10);//传了一个常量