一、构造方法
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