[Java基础篇]对Java中的构造方法、实例方法和类方法的剖析

一、构造方法

1、什么是构造方法?

用于创建对象并初始化对象属性的方法,叫构造方法,也叫构造器,在类中定义,且类是一定有构造器的。

2、构造器的特点

· 构造器与类同名
· 每个类可以有一个以上的构造器
· 构造器可以重载有0、1、或多个参数
· 构造器没有返回值
· 构造器总是伴随着new操作一起调用,对象一建立,构造器就运行且只运行一次。一般方法可以被调用多次。
构造器之间可以相互利用(只能用this())

///构造器的格式
修饰符  类名(参数列表){
   ...
}

public class  Phone{
    String name;
    Phone (String Name){///自定义构造器,public可以忽略
       name=Name;
    }
    public static void main(String args[]){
       Phone p = new Phone("华为");
       System.out.println(p.name);
    }
}

3、默认构造器和自定义构造器

· 默认构造器(如果类中没有构造器,Java编译器自动添加): 无参数,方法体是空的构造器,且默认构造器的访问权限随着所属类的访问权限变化而变化(如类的修饰符为pubilc,则构造器的也是)。默认构造器是隐藏的。
注意: 如果类中没有自定义的无参构造器,不能去调用无参构造器,否则会报错。
· 自定义构造器: 自己定义(参数、方法体…)的构造器。
注意:当构造方法为private级别时,意味着只能在当前类中访问它。

4、关键字super和this的区别

(1)super和this的含义
· super: 代表父类存储空间标识(父亲的引用)
· this: 代表当前对象的引用
(2)super和this的用途
· super的用途:①引用隐式参数;(隐式参数:声明在方法名前的,隐藏的)
②调用该类其他的构造器。
· this的用途:①调用超类(父类)的方法;
②调用超类(父类)的构造器。
(3)super和this在程序中的注意事项

super(): 调用父类的其他构造器,一定在子类调用构造器第一行使用。如果没有就默认添加super()
this(): 是访问当前对象,本类对象的引用,能区分实例变量和局部变量(也就是不同名),this可省略,否则不能省。

在构造器中,super(…)和this(…)不能同时出现,否则会出现初始化两次的不安全操作,因为super(…)和this(…)同时出现的话,在调用super(…)之后还会执行this(…),而this(…)又会自动调用super(…),这就造成了调用两次super(…)的结果。


class Animal{

    String name;
    int age;
    Animal(String name,int age){///自定义
       this.name=name;
       this.age=age;
    }

    public void eat(){
        System.out.println("eat()!!!");
    }
}
class Cat extends Animal{
    ///如果父类没有自定义构造器,子类是调用父类默认构造器初始化(一定调用的,无论是否子类构造是否存在)
    int Children;
    Cat(String name,int age,int Children){
      super(name,age);
      this.Children=Children;///父类没有的功能,可以用this
      /*
      this.name=name;///已经初始化,不能再初始化了,
      this.age=age;
      */
    }
     public void eat(){
         System.out.println("猫吃鱼!!!");
     }

     public void show(){
        System.out.println("此"+this.name+"活了"+this.age+"年且有"+this.Children+"个孩子");

     }
}
public class Demo {
    public static void main(String [] args){
        Cat c = new Cat("cat",2,3);///带有变量的初始化
        c.eat();///就近原则,覆盖父类方法
        c.show();
    }
}

this的运用(构造器之间的相互利用)

public class Animal{
    String name;
    int age;
    int child;
    public Animal(String name){
        this.name=name;
    }
    public Animal(String name,int age){///自定义
       this(name);///调用另一个重载的构造器,只能再构造器中使用
       this.age=age;
    }
    public Animal(String name,int age,int child){
        this(name,age);
        this.child=child;
    }

    public static void main(String [] args){
        ///Animal animal= new Animal();///如果没有自定义构造器,就是调用默认构造器的初始化:null 0 0
        Animal animal= new Animal("Dog",5,10);
        System.out.println(animal.name);
        System.out.println(animal.age);
        System.out.println(animal.child);
    }
}

二、实例方法

就是可以通过类的实例(某个对象)调用的方法,也就是我们正常情况下使用的方法。实例方法也称为成员方法、对象方法、非静态方法

当类的字节码文件加载到内存中时,类的实例方法并没有被分配入口地址,只有当该类的对象创建以后,实例方法才分配了入口地址。从而实例方法可以被类创建的所有对象调用,还有一点需要注意,当我们创建第一个类的对象时,实例方法的入口地址会完成分配,当后续在创建对象时,不会再分配新的入口地址,也可以说,该类的所有对象共享实例方法的入口地址,当该类的所有对象被销毁,入口地址才会消失。

实例方法的特点:
1、实例方法中可以引用实例变量,也可以引用类变量(成员变量);
2、实例方法可以调用类方法;
3、类方法中可以使用super和this的关键字

三、类方法

就是直接可以用类名调用的方法,也就是被关键字static修饰的方法,它不需要创建类的对象来调用该方法。类方法也叫静态方法

当字节码文件(.class)加载到内存,类方法的入口地址就会分配完成,所以类方法不仅可以被该类的对象调用,也可以直接通过类名完成调用。类方法的入口地址只有程序退出时消失。

类方法的特点:
1、用static修饰的方法;
2、类方法中不能调用类的实例方法;
3、在类方法中不能使用super、this关键字;
4、类方法不能被覆盖;
5、在类方法中不能引用实例变量;

public class Main {
    public void Method(){
        System.out.println("我是实例方法!");
    }
    public static void StaticMethod(){
        System.out.println("我是类方法,也是静态方法!");
    }
    public static void main(String [] args){
        Main m = new Main();
        m.Method();///实例方法必须有对象才能调用

        m.StaticMethod();///类方法的调用方法1:对象名.类方法名

        Main.StaticMethod();///类方法的调用方法2:类名.类方法名,一般选择这种方法,没有实例,如:随机数的获取Math.random()
    }
}

四、参考资料

1、https://www.cnblogs.com/miaoxingren/p/9366958.html
2、https://blog.csdn.net/c1776167012/article/details/102687737
3、https://blog.csdn.net/joxlin/article/details/81911330
4、https://www.jianshu.com/p/60ba478f101d
5、https://www.cnblogs.com/sunyubin/p/9751412.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章