class{ field;//成员属性 method;//成员方法 } // 实例化对象 <对象名> = new ();
代码示例:
class Student{ public String name; public char sex; public int age; public void study(){ System.out.println("学习"); } public void eat(){ System.out.println("吃饭"); } }
这里我们创建了一个 Student 类,其中有成员属性:name、sex、age。和成员方法:study、eat。
class Student{ public String name; public char sex; public int age; public void study(){ System.out.println("学习"); } public void eat(){ System.out.println("吃饭"); } } public class TeatDemmo{ public static void main(String[] args){ Student stu1 = new Student(); stu1.study(); stu1.eat(); } }
其中 stu1 就是类 Student 的一个实例,我们创建了实例后才能在另一个类中用到这个类里面的成员方法和成员属性。
成员方法:用于描述一个对象的行为,就相比于C语言中的函数
class Student{ public String name; public int age; public char sex; public Student(String name,int age,char sex){ this.name = name; this.age = age; this.sex = sex; } } public class Data{ public static void main(String[] args) { Student stu1 = new Student("张三",20,'男'); } }
此处 Student() 方法就是我们的构造方法,构造方法在实例化对象的时候就会被自动调用,一般用于对象的初始化。
调试结果截图:
这里我们可以看到,我们只使用了实例化对象,但是以经给成员变量赋值了。 构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作。new 执行过程class Person { private String name; private int age; private String sex; public Person() { this("bit", 12, "man");//必须放在第一行进行显示 } //这两个构造函数之间的关系为重载。 public Person(String name,int age,String sex) { this.name = name; this.age = age; this.sex = sex; } } public class Main{ public static void main(String[] args) { Person person = new Person();//调用不带参数的构造函数 } }
这里我们使用了构造方法的重载,我们在 main()函数中实例化的时候没有传参,说明我们自动调用了不带参数的构造方法。在不带参数的构造方法中我们又使用了 this() 函数,这个函数的作用是调用其他的构造方法(根据传参来选择调用哪个构造方法)。
注意:this() 方法必须在该构造方法的第一行。
代码示例:
class Student{ public String name; public int age; public char sex; public static String classroom; public Student(String name,int age,char sex){ this.name = name; this.age = age; this.sex = sex; } public static void func(){ System.out.println("这是一个静态方法"); System.out.println(classroom); } } public class Data{ public static void main(String[] args) { Student stu1 = new Student("张三",20,'男'); Student.classroom = "2022308"; Student.func(); } }
通过上述代码我们可以看出,在我们使用被 static 修饰过的成员变量或方法的时候,并不需要对象实例化,我们只需要通过类来调用。而且在静态方法里面我们可以直接使用静态成员变量。
运行结果图:
上述代码数据属性的内存布局:
因此被 static 关键字修饰的变量并不存在类中,不需要用用实例化来调用。
class Student{ public String name; public String id; public int age; public char sex; public static String classroom; static{ classroom = "2000123"; System.out.println("这是一个静态代码块"); } { this.name = "小明"; this.id = "202258454"; this.age = 20; this.sex = '男'; System.out.println("这是一个构造代码块"); } public Student(){ System.out.println("这是一个构造方法"); } } public class Data{ public static void main(String[] args) { Student stu = new Student(); } }
我们在 Student 类中写了一个静态代码块一个构造代码块和一个构造方法。接下来我们来看当实例化对象的时候,它们三个的执行顺序。
我们可以看到静态代码块优先于构造代码块优先于构造方法。 注意事项class Person { private String name; private int age; public Person(String name,int age) { this.age = age; this.name = name; } public void show() { System.out.println("name:"+name+" " + "age:"+age); } //重写Object的toString方法 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Data { public static void main(String[] args) { Person person = new Person("小明",19); person.show(); System.out.println(person); } }
输出结果:
注意事项