java语言学习(3)------初级篇完稿

第七章续

方法重载

定义:java中允许一个类中,多个同名方法的存在,但是要求形参列表不一样。

重载的好处:

  • 减轻了起名的麻烦

  • 减轻了记名的麻烦

重载的细节:

  • 方法名必须相同

  • 形参列表必须不同(形参类型或个数或顺序,至少有一样不同,参数名无要求)

  • 返回类型无要求

可变参数

概念:java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。

基本语法

访问修饰符 返回类型 方法名(数据类型… 形参名)

快速入门

    class Dog(){
        public int sum(int... nums){
            //int... 表示接受的是可变参数,类型是int,即可以接收多个int(0——多)
            //使用可变参数时,可以当作数组来使用,即nums 可以当作数组
            //遍历nums求和即可
            int res = 0;
            for(int i = 0;i<nums.length;i++){
                res += nums[i];
            }
        }
        return res;
    }

注意事项和使用细节

  • 可变参数的实参可以是0或者任意多个

  • 可变参数的实参可以为数组

  • 可变参数的本质就是数组

  • 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后面

  • 一个形参列表中只能出现以一个可变参数

作用域

  • 在java编程中,主要的变量就是属性(成员变量)和局部变量

  • 我们说的局部变量一般是指在成员方法中定义的变量。

  • java中作用域的分类

    • 全局变量:也就是属性,作用域为整个类

    • 局部变量:也就是除了属性之外的其他变量,比如代码块,方法内的变量

  • 全局变量可以不赋值,直接使用,因为有默认值,局部变量必须赋值后,才能使用,应为没有默认值

注意事项和细节

  • 属性和局部变量可以重名,访问时遵循就近原则

  • 在同一个作用域中,比如在通过一个成员方法中,两个局部变量,不能重名

  • 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量,生命周期较短,伴随着他的代码块的执行而创建,伴随着代码块的结束而死亡。即在一次方法调用过程中

  • 作用域范围不同

    • 全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
      class T{
          public void test(){
              Person p1 = new Person();
              System.out.println(p1.name);
          }    
      }
      class Person{    
          String name = "jack";
      }
  • 局部变量:只能在本类中对于的方法使用

  • 修饰符不同

  • 全局变量/属性可以加修饰符

  • 局部变量不可以加修饰符

构造方法/构造器

需求:构造方法又叫构造器,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化

  • 方法名和类名相同

  • 没有返回值

  • 在创建对象时,系统会自动的调用该类的构造器,完成对象的初始化

基本语法

[修饰符] 方法名(形参列表){

方法体;

}

  • 构造器的修饰符可以默认,也可以是public protected privata

  • 构造器没有返回值

  • 方法名和类名字必须一样

  • 参数列表 和成员方法的规则一样

  • 构造器的调用,由系统完成

    public class Constructor{
      public static void main(String[] args){
          //当我们new 一个对象时,直接通过构造器指定名字和年龄
          Person p1 = new Person("smith",80);
      }
    }
    //在创建人这个对象时,就直接指定了这个对象的年龄和姓名
    class Person{
      String name;
      int age;
      //构造器没有返回值,也不能写void
      //构造器的名称和类Person一样
      //(String pName.int pAge)是构造器形参列表
      public Person(String pName,intpAge){
          name = pName;
          age = pAge;
      }
    }

构造器的注意事项和使用细节

  • 一个类可以定义多个不同的构造器,即构造器的重载

    • 比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名,不需要指定年龄
  • 构造器名和类名要相同

  • 构造器没有返回值

  • 构造器是完成对象的初始化,并不是创建对象

  • 在创建对象时,系统自动的调用该类的构造方法

  • 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器(也叫默认构造器)

  • 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显示的定义一下 Person(){}

对象创建流程

java语言学习(3)------初级篇完稿_第1张图片

  • 加载Person类信息,只会加载一次

  • 在堆中分配空间(地址)

  • 完成对象初始化

    • 默认初始化

    • 显示初始化

    • 构造器初始化

  • 把对象在堆中的地址返回给p

this

解决:构造器的输入参数名不是特别友好,如果能够将dName 改成 name 就好了,但是我们会发现安装变量的作用域原则,name的值就是null 。

    class Dog{
        int age;
        String name;
        //如果直接将构造器的参数写成属性名,会出现问题
        //构造器的name 是局部变量,而不是属性
        //构造器的age 是局部变量,而不是属性
        //引出this关键字来解决
        public Dog(String name,int age{
            name = name;
            age = age;
            //解决方案
            this.name = name;
            this.age = age;
            //这里的this.age相当于当前对象的属性age
        }
    }

深入了解this

使用hashcode 会针对不同的对象返回不同的整数。着一般是将该对象的内部地址转换成一个整数来实现的。所以可以将它类似看成地址

    public class work{
        public static void main(String[] args){
            Dog dog1 = new Dog(2,"小黄");
            System.out.println("dog1 的hashcode " + dog1.hashCode());
        }
    }
    
    class Dog(){
        int age;
        String name;
        public Dog(int age.String name){
            this.age = age;
            this.name = name;
            System.out.println("this.hashCode "+ this.hashCode());
        }
    }

this小结

简单的说,哪个对象调用,this就代表哪个对象

this的注意事项和使用细节

  • this关键字可以用来访问本类的属性,方法,构造器

  • this用于区分当前的属性和局部变量

  • 访问成员方法的语法:this.方法名(参数列表)

  • 访问构造器的语法:this(参数列表);注意只能在构造器中使用。小细节:如果有访问构造器这个语法,就必须放在第一条语句(与继承有关系)

  • this不能在类定义的外部使用,只能在类定义的方法中使用

this访问方法名

    class dog{
        public void f1(){
            System.out.println("成功调用f1");
        }
        public void f2(){
            System.out.println("成功调用f2");
            f1();
            this.f1();
            //这里的区别以后讲到继承的时候会说
        }
    }

this访问构造器

    class dog{
        int age;
        String name;
        public dog(int age){
            this("坏人",10);
            this.age = age;
            System.out.println("访问到(int age)");
        }
        public dog(String name,int age){
            this.age = age;
            this.name = name;
            System.out.println("访问到(String name,int age)");
        }
    }

昨天晚上好像睡多了,脑袋晕乎乎的。
估计等会就好了,emmm

恭喜我们把第一部分,基础篇学完了,接下来,我们将开展中级篇的部分。
学习的旅程还在继续,小目标的实现将在眼前。

你可能感兴趣的:(Javase,学习历程,java,学习,python)