java学习第五篇下(对象与类)

方法重载:

        同一类中有多个方法名相同但参数列表不同的方法,这种现象称为方法重载。其中参数列表不同包括以下情形:

                   1、参数的个数不同

                   2、参数对应的类型不同

public class Computer{
    int add(int a,int b){
         return a+b;        
    }
    void add(int a,int b,int c){
         int result=a+b+c;
        System.out.println(result);
    }
    public int add(int a,int b,int c,int d){
         return a+b+c+d;   
    }

}

注意:

             1、参数列表不同并不包含参数名不同,也就是说如果方法名相同,方法中的参数个数和类型相同,只是参数名不同,这样也不能称之为方法重载。

                2、方法中的其他构成成分不参与比较,访问控制符、修饰符、返回值类型。

一个类中有许多同名方法(构造方法或普通方法),在调用这些方法时,到底调用哪个方法取决于调用方法时参入参数的数据类型和个数。

public class Teacher{
    public static void print(int age,String name){
        System.out.println(age+","+name);
    }
    public static void print(String name,int age){
        System.out.println(name+","+age);
     }
    public static void main(String []args){
        print(33,"小明");
        print("小明",33);
  
    }
} 

代码块:

java中的代码块分为静态代码块和非静态代码块

静态代码块只在类加载时执行一次:

public class Test{
    static {
          System.out.println("静态代码块");
    }

    public static void main(String []args){
    }
}

               非静态代码块每次创建对象都会执行

public class Test{
      {
          System.out.println("非静态代码块");
      }
      public class void main(String []args){
            new Test();
            new Test();
     } 
}

             执行如下代码结果为

public class Test{

     {
          System.out.println("非静态代码块");
     }
     static {
          System.out.print("静态代码块");
     }
     public static void main(String []args){
           new Test();
           new Test();
     }
}

        结果为:静态代码块

                       非静态代码块

                       非静态代码块

全局变量与局部变量:

成员变量:实例属性和类属性(static修饰)

局部变量:形参(定义在方法括号中的参数)方法局部变量(方法中定义的变量)代码块局部变量(在代码块内定义的变量)

成员变量:直接在类中声明的变量叫做成员变量(又称全局变量)

public class Field{
     static int v;//定义int类型数据
     static double w;//定义double类型数据
     static char x;//定义char类型数据
     static boolean y;//定义boolean类型数据
     static String z;//定义String类型数据
     public static void main(String[]args){
         System.out.println(v);//输出0
         System.out.println(w);//输出0.0
         System.out.println(x);//输出空,实际上此时x的值是0
         System.out.println(y);//输出false
         System.out.println(z);//输出null
     }
}

如果未对成员变量设置初始值,则系统会根据成员变量的类型自动分配初始值:int类型分配初始值0、boolean类型分配初始值false,而自定义类型则分配初始值null。

成员变量定义后,其所在的作用域在整个类。

public class Field{
    static int x=9;
    
    public static void main(String[]args){
         System.out.println(x);//输出10
         System.out.println(flag);//输出true
    } 
    static boolean flag=true;//定义boolean类型数据 
}

成员变量的定义没有先后顺序,但最好将成员变量集中定义在类的顶部。

局部变量:    方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量。

                      局部变量的作用范围从定义的位置开始到其所在语句块结束。

public class Test{
      {
           int x=9;//定义代码块局部变量
           System.out.println(x);
       }
      static void show(int args){//定义方法参数中的局部变量
           if(args==1){
                 int y=2;//方法中的局部变量
                 System.out.println(y);
           }
           // System.out.println(y);此处不能使用y局部变量
           System.out.println(args);  
      }
      public static void main(String []args){

          new Test();//用于执行代码块中的代码
          show(1);
       }

}

如果局部变量的名字与全局变量的名字相同,则全局变量被隐藏,即这个全局变量在同名局部变量所在的方法内暂时失效。

如果要在该局部变量作用域范围内访问该成员变量,则必须使用关键字this来引用成员变量。

public class Test{
     int x=1;

     void show(){
          int x=8;
          System.out.println(x);//输出1
          System.out.println(this.x);//输出8
     }

     public static void main(String []args){
           new Test().show();
     }
}

注意:关键字this不能被static修饰的方法中使用。

局部变量在使用之前必须显式初始化或赋值,局部变量没有默认值。

public class Test{
      static void show(int x){
           System.out.println(x);
           int y;
           //System.out.println(y);去掉注释符号报错
           y=2;
           System.out.println(y);

      }
      public static void main(String[]args){
          show();
     }
}

声明局部变量时,数据类型前除final外不容许有其他关键字,即定义格式为:[final] 数据类型 变量名=初始值;

public class Test{
     public class void main(String []args){
          int y=2;//在int前面添加public、static都会出错
          System.out.println(y);//输出2
     }
}

关键字static

成员变量:

           static修饰的成员变量称为类属性(又称静态变量):类成员变量的值在所有对象之间共享;jvm加载类时初始化;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用。

          没有static修饰的成员变量称为实例属性(又称非静态变量):变量值只属于单个对象:jvm执行创建对象代码时初始化,只能使用对象来调用。

方法:

       static 修饰的方法称为类方法(又称静态方法):此种方法被所有该类的对象共享;jvm加载类时为其分配入口地址;可以由所在类创建的对象或类名来调用,推荐使用类名直接调用。

        没有static修饰的方法称为实例方法(又称非静态方法):此种方法对所有该类的对象都是独立的;jvm执行创建对象代码时为其分配入口地址并且只分配一次,只能使用对象来调用。

代码块:

      static 修饰的代码块称为静态代码块:jvm加载类时该类型代码执行并且只执行一次;

    没有static 修饰的代码称为非静态代码块:jvm执行创建对象代码时执行并且每创建一个对象执行一次。

注意:

      静态方法不能直接调用非静态方法,可以间接通过创建该方法(指非静态方法)所在类的对象来调用;非静态方法可以直接调用静态方法;

         静态代码块不能直接调用非静态方法;可以间接通过创建该方法(指非静态方法)所在类的对象来调用;静态代码块可以直接调用静态方法

        静态方法或者静态代码块不能直接使用非静态成员变量,可以间接通过创建该成员变量的对象来调用,静态方法或者静态代码块只能使用静态变量。

构造方法:

    有如下Teacher类:

public class Teacher{
    int age;//年龄
    String name;//姓名
    String position;//职位
    String education;//学历

    public static void main(String []args){
        return  "大家好!我是"+name+",我今年"+age+"岁,学历"+education+",目前的职位是"+position;
   }
}

Teacher类有太多属性,每次给属性赋值时非常麻烦:编码量大,无法重用给属性赋值的代码,有没有可能简化对象初始化代码。

什么是构造方法?

         1、构造方法负责初始化类中的实例变量

          2、构造方法是一种特殊的方法,这种方法必须满足以下语法规则:构造方法必须与类名相同;不包含返回值描述部分。

           3、构造方法不能有static 和final关键字修饰

如何使用构造方法?

    使用new关键字调用构造方法,即构造方法在创建对象(也称实例化对象)时被调用。

public Test{
      public static void main(String []args){
             Teacher teacher=new Teacher();//创建Teacher对象
      }
}

由于Teacher类没有显式构造方法,这时Teacher类就会有一个默认无参构造方法。

显式构造方法:  

            创建类时,如果没有显式定义构造方法,该类就会存在一个默认的无参构造方法;

            可以在类中声明一个或多个有参构造方法,但每个构造方法在参数个数或参数数据类型上要有所差异:

public class Test{

   String name;
   string education;
   int age;
   String position;
   
   public Test(String name){
        this.name=name;
   }
   
   public Test(int age){
       this.age=age;
   }

   public Test(String name,int age){
         this.age=age;
         this.name=name;

   }
}

       第一个构造函数和第二个参数个数相同,但参数数据类型不同

      第三个和前面两个在参数个数和参数数据类型上均不同

如果类中存在显式构造方法,则默认的无参构造方法将不存在,除非显式定义无参构造方法;

只有一个有参构造方法:

public class Student{

    String name;
    int age;

   public Student(String name,int age){
          this.name=name;
          this.age=age;
    }

    public static void main(String []args){
         Student stu=new Student();//代码报错
      }
}

在上面的代码中插入

public Student(){

}

即显式定义无参构造方法。

类中可以有多个构造方法,构造方法之间可以通过this实现调用,但必须将调用构造函数代码写在有效代码第一行

public class Student{
     String name;//姓名
     int age;//年龄

     public Student(String name){
           this.name=name;
    }
    public Student(String name,int age){
            this.age=age;
            this(name);
     }
}

上面的第二个构造函数换成:

public Student(String name,int age){
      this(name);
      this.age=age;
}

注意:普通方法不能使用this调用类中构造方法,例如:

public class Student{
    String name;
    int age;
    
    public Student(String name){   
          this.name=name;

     }
     public static void main(String[]args){

          this(name);//报错
    } 

}

    关键字this

        this代表对当前对象的一个引用。

public class Student{

    public void printInfo(){
         System.out.println(this);
    }
    public static void main(String[]args){
         Student stu=new Student();
         System.out.println(stu);
         stu.printInfo();
    }

}

     this在实例方法中通常被省略,除非实例化方法中包含于成员变量同名的局部变量时,访问成员变量需要使用this

    this关键字用于调用属性、方法及本类中的构造方法

对象初始化过程:

public class Student{
     String name="张三";
     //思考:执行非静态代码块时,对象已经创建了吗?
     {
        System.out.println("非静态代码块"+this.name);
     }
     //思考:调用构造方法时,对象已经存在了吗?
     public Student(String name){
          this.name=name;
          System.out.println("构造方法"+this.name);
     }
     //思考:先调用非静态代码块还是先调用构造方法?
     public static void main(String[]args){
           Student stu=new Student();
     }
}

     运行结果先输出张三,然后输出李四,可见一定先调用非静态代码块,再调用构造方法,并且调用非静态代码块时所创建的对象的实例属性值为初始化值,或者是默认值(如果没有初始化值)

用new创建并初始化对象的步骤:

      1、给对象的实例变量(非“常量”)分配内存空间,默认初始化值;

       2、成员变量声明时的初始化

      3、初始化块初始化(又称构造代码块或非静态代码块)

      4、构造方法初始化

               2、方法中的其他成分

猜你喜欢

转载自blog.csdn.net/Blues_lin/article/details/81391102
今日推荐