构造方法及其重载
目录
文章目录
什么是构造方法
构造方法 : 用来初始化对象的方法
(1) 构造方法名与类名相同 , 且没有返回值,且不需要使用void修饰 。
(2) 作用:在构造方法中为创建的对象初始化赋值,
(3) 在创建一个对象的时候,至少要调用一个构造方法。
(4) 每个类都有构造方法。如果没有显式地为类定义构造方法,Java将会为该类提供一个默认构造方法,但是只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效。
我们说构造方法是用来初始化对象的,那么它是怎样去初始化的呢,回想我们创建对象的语法
例 : Car car= new Car();
我们可以看到new关键字右边的这一块 ,这其实就是调用了Car类的构造方法来创建此对象的
无参构造快捷启动
代码示例
Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person(); //实例化
person.talk("你好");
}
}
Person.java
public class Person {
public Person() {
//无参构造
System.out.println("这是一个构造函数");
}
//隐藏了一个无参构造函数
public void talk(String pString){
System.out.println("talk==>"+pString);
}
}
把无参构造的 public 去掉也可以运行,无参函数默认是 public
无参构造的 public 后面不能跟 void
不能把系统默认的公有转为私有,导致函数无法调用
非无参构造的 public 去掉也可以运行,默认是公有
基于无参构造快速修改文件内容,初始化构造
public class Person {
private String name = "张三";
public Person(String pName) {
//无参构造
System.out.println("这是一个构造函数");
name = pName;
}
//隐藏了一个无参构造函数
public void talk(String pString){
System.out.println("talk==>"+pString);
System.out.println("我的名字叫"+name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("王二麻子"); //实例化
person.talk("你好");
}
}
运行结果
这是一个构造函数
talk==>你好
我的名字叫王二麻子
构造方法特点
构造方法的特点
1、构造方法名一定与类同名
2、构造方法无返回值类型(void 也不行)
3、构造方法可以没有(默认一个无参构造方法),也可以有多个构造方法,他们之间构成重载关系
4、如果定义有参构造函数,则无参构造函数将被自动屏蔽
5、构造方法不能被继承
6、构造方法不能手动调用,在创建类实例的时候自动调用构造方法
7.大驼峰命名法
构造函数赋值但是没有传值,默认得到的结果是null
Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person("王二麻子"); //实例化
person.talk("你好");
}
}
Person.java
public class Person {
private String name;
public Person(String pName) {
//无参构造
System.out.println("这是一个构造函数");
// name = pName;
}
//隐藏了一个无参构造函数
public void talk(String pString){
System.out.println("talk==>"+pString);
System.out.println("我的名字叫"+name);
}
}
运行结果
这是一个构造函数
talk==>你好
我的名字叫null
Process finished with exit code 0
方法重载
在一个类中,方法名不同,参数不同,会构成方法重载
类和构造方法中可以使用this指针
Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person("王二麻子",12); //实例化
person.talk("你好");
}
}
Person.java
public class Person {
private String name;
private int age;
public Person(String pName,int pAge) {
//无参构造
System.out.println("这是一个构造函数");
// name = pName;
this.age = pAge;
//this指针
}
//隐藏了一个无参构造函数
public void talk(String pString){
System.out.println("talk==>"+pString);
//在类中可以使用this指针
System.out.println("我的名字叫"+this.name);
System.out.println("我的年龄"+age+"岁");
}
}
运行结果
这是一个构造函数
talk==>你好
我的名字叫null
我的年龄12岁
Process finished with exit code 0
方法的重载既可以独立重载也可以分开重载
Main.java
public class Main {
public static void main(String[] args) {
Person person = new Person("王二麻子"); //实例化
Person person1 = new Person(2);
person.talk("你好");
person1.talk("你好");
}
}
Person.java
public class Person {
private String name;
private int age;
public Person(String pName) {
//无参构造
System.out.println("这是一个构造函数");
// name = pName;
}
public Person(int pAge){
age = pAge;
//this指针
}
//隐藏了一个无参构造函数
public void talk(String pString){
System.out.println("talk==>"+pString);
//在类中可以使用this指针
System.out.println("我的名字叫"+this.name);
System.out.println("我的年龄"+age+"岁");
}
}
运行结果
这是一个构造函数
talk==>你好
我的名字叫null
我的年龄0岁
talk==>你好
我的名字叫null
我的年龄2岁
frida对照
java构造方法的重载对应了frida 类$init重载选项,根据数据类型overload(‘int’,‘数据类型’)
java与frida数据类型关系
Java Type (Java中参数类型) | Frida Type (frida脚本中参数类型) |
---|---|
int | int |
byte | byte |
short | short |
long | long |
float | float |
double | double |
char | char |
(比如String、List) | .(比如java.lang.String、java.util.List) |
int[] | [I |
byte[] | [B |
short[] | [S |
long[] | [J |
float[] | [F |
double[] | [D |
char[] | [C |
[](比如String[]) | L.; (比如 [Ljava.lang.String;) |