Java中所有类都有构造方法,用来进行该类对象的初始化,构造方法也有名称,参数和方法体以及访问权限的设定。
1.构造方法的完整定义格式如下:
[public|protected|private]<class_name>([argument_list>])
{
[<statements>]
}
2.访问限定符(4种)
♦public :任何类都能够创建这个类的实例对象。
♦protected:只有这个类的子类以及与这个类在同一个包中的类可以创建这个类的实例对象。
♦private:没有其他类可以实例化该类,只有这个类中具有public权限的方法可以构造该类的对象。
♦没有访问权限设定:只有与该类在同一个包中的类可以创建该类的实例化对象。
3.构造方法的特点:
♥构造方法的名称必须与类名相同。
♥构造方法不能有返回值。
♥用户不能直接调用构造方法,必须通过关键字new 自动调用它。
( 补充:)
1.用class定义的类型叫做类类型。
2.一个类是用来描述一个实体(属性+行为)的抽象类型。
类(成员变量)=》实体的属性的
类(成员方法)=》实体的行为的
3.类里面的所有成员都可以做访问限定,如:public,private。。。
4.对象的成员变量如果没有初始化,会自动进行初始化的,
引用类型的变量==》null
简单类型的变量:byte,short,int,long==》0
float,double==》0.0
boolean==》false
char==》'\u0000'
5.构造方法的特点:
new对象的时候,先分配内存,然后自动调用相应的构造函数。
构造函数专门做成员变量的初始化操作。
成员变量没有返回值,只有函数名和参数列表。
构造函数的名字只能和类名相同。
6.类里面
7.static成员变量是属于类级别的,是所有这个类实例化的对象所共享的变量
普通的成员变量是属于对象级别的,是每一个对象所私有的。
8.static成员方法属于类级别,调用时通过 ( 类名. ) 进行调用,方法中没有this引用
普通的成员方法必须通过 (对象. ) 来调用,方法中没有this 引用变量。
4.默认的构造方法
在Java类中可以不定义构造方法,而其他类仍然可以通过调用new XXX()来实例化XXX类的对象。
这是因为Java在编译时,给没有定义构造方法的类自动加入了一个特殊的构造方法。这个方法不带参数,且方
法体为空,称为类默认的构造方法。
用默认构造法方法初始化对象时,由系统用默认值初始化对象。
5.重载构造方法
构造方法可以重载,即定义多个构造方法,其参数表不同,重载构造方法的目的是使类对象具有不同的初始值,为类对象的初始化提供方便。
补充:
javap -c +类名.class 该文件的反汇编
javac 类名.class 程序的编译成class字节码文件
java 类名 运行字节码文件
jps 查看运行的进程和进程号(pid)
jmap 查看堆上的对象信息
jmap -histo[:live] pid 查看堆上活着的对象
jmap -histo[:live] pid ->log.txt 并且输出到log文件中(查看该文件 start. 找到该文件打开)
this是Java使用的一个有特定意义的引用,它指向当前对象自身,
public class Student { // 对象级别的,属于每一个对象私有的 // 学生的学号 private Integer id; // 学生的姓名 private String name; // 年龄 private Integer age; // 性别 private String sex; // 统计学生的数量 属于类级别的,所有对象共享的 private static int count; // 类的构造函数 public Student(){ this.id = 0; this.name = "default"; this.age = 0; this.sex = "default"; count++; } public Student(Integer id, String name, Integer age, String sex){ this.id = id; this.name = name; this.age = age; this.sex = sex; count++; } // 唱歌的方法 public void sing(String name){ System.out.println(this.name + " singing " + name); } // 打印学生的信息 public void show(){ System.out.println("id:" + this.id); System.out.println("name:" + this.name); System.out.println("age:" + this.age); System.out.println("sex:" + this.sex); } public static void main(String[] args) { // 类实例化了一个学生对象 Student s1 = new Student(); // 对象s调用自己的成员方法 s1.show(); Student s2 = new Student(1000, "zhang san", 22, "男"); s2.show(); Student s3 = new Student(1000, "li si", 22, "男"); // s2.showStudentNumber();//查询该班级人数不应该依赖于某个实例对象
Student.showStudentNumber(); } /** * static静态方法,属于类级别的,表示当前这个方法不依赖于具体的 * 对象了,它操作的是所有对象共享的一些信息 */ private static void showStudentNumber() { System.out.println("student number:" + count); } }
其中构造函数中的this.id ,this.name,this.age,this.sex指向的是当前对象的id,name,age,sex变量。实际上,在一个对象的方法被调用执行时,java会自动的给对象的变量和方法都加上this的引用,指向内存堆中的对象。public void sing(String name),这其中的参数name就不是成员变量,就不需要this。