java类的引入
对比:
构造方法:完成对象的初始化,不是创建对象(在调用构造器时空间已经分配好了);在创建对象的时候,系统会自动调用该类的构造器
1. 方法名和类名相同
2. 方法没有返回值,且用public修饰
3. 可以有任意多个参数(默认是没有参数)
注:可以有多个构造函数,一旦定义了自己的构造器,默认的构造器就被覆盖了,就不能再使用默认的无参构造器,除非显示的定义下
class Person { String name; int age; String getName() {
this.getAge();//this来访问成员方法 return "guangdong "+name; }
int getAge(){
System.out.println("this age");
}
/* construct method */ public Person () {/* 显示定义无参的构造器*/ name = "null"; age = 0; } public Person (String name) {//带一个参数的构造方法
this("wangwu", 16);//可以在本类中的一个构造器中访问本类中的另一个构造器,且this(参数列表)要放在构造器中的第一句 this.name = name; } public Person (String name, int age) {//带两个参数的构造方法 this.name = name;//区分当前类的属性和局部变量,如上面的解释 this.age = age; } }; public class Oop3 { public static void main(String args[]) { Person p1 = new Person("zhangsan");//在实例化p1对象时,带一个参数的构造方法被调用 Person p2 = new Person("lisi"); Person p3 = new Person();//在实例化p3对象时,带没有参数的构造方法被调用 Person p4 = new Person("wangwu", 6);//在实例化p4对象时,带两个参数的构造方法被调用 System.out.println(p1.getName()); System.out.println(p2.getName()); System.out.println(p3.getName()); System.out.println(p4.getName()); } }
this关键字:
表示当前对象/当前类的属性,如上面person类中的name和age,this.name就表示当前类中的属性name;this.age就表示当前类中的属性age,所以用同名的name和age赋值就不会有冲突,如果没有this,那么name = name,根据变量的就近原则,这两个name都表示参数中的name,就不对。
1. this关键字可以用来访问本类中的属性、方法、构造器
2. this用于区分当前类的属性和局部变量,如上面的解释。
3. 可用this来访问成员方法,如this.方法名(参数列表)
4. 访问构造器,可以在本类中的一个构造器中访问本类中的另一个构造器,且this(参数列表)要放在构造器中的第一句
5.this不能在类定义的外部使用,只能在类定义的方法中使用
static关键字:
static修饰方法,叫做类方法,即可以不用实例化对象就可直接通过类.方法名直接调用
1. 静态方法中不允许使用和对象有关的关键字,如this、super
2. 静态方法中只能访问静态变量和静态方法
3. 普通方法可以访问普通变量(方法),也可以访问静态变量(方法)
即静态方法只能访问静态成员;非静态方法既可以访问静态成员,也可以访问非静态成员
static修饰属性,叫做类属性(静态变量),也可以不用实例化对象就可直接通过类.属性名直接调用
1. 静态变量是同一个类所有对象共享,任何一个对象去访问它时,取到的都是相同的值
2. 静态变量在类加载时就生成了(可以在堆中,也可以在方法区的方法域中,这要看jdk的版本),所以即使没有创建对象实例,也可以通过类名.类属性名访问
3. 类变量的生命周期随类的加载开始,随着类的消亡而销毁
静态变量在内存中的布局:
注:main方法就是用static修饰的,所以JVM不用实例化对象就能直接调用main函数了
class Person { static int count;//类属性 String name; int age; String getName() { return "guangdong "+name; } /* construct method */ public Person () { count++; name = "null"; age = 0; } public Person (String name) { count++; this.name = name; } public Person (String name, int age) { count++; this.name = name; this.age = age; } static void printPerson () {//类方法 System.out.println("This is a class of Person"); } }; public class Oop4 { public static void main(String args[]) { Person p1 = new Person("zhangsan"); Person p3 = new Person(); Person p4 = new Person("wangwu", 6); System.out.println(p1.getName()); System.out.println(p3.getName()); System.out.println(p4.getName()); Person.printPerson();//调用类方法或类属性可以不用实例化对象 System.out.println(Person.count); } }
代码块:另外一种形式的构造器(对构造器的补充机制),做初始化操作。如果每个构造器中都有的重复语句,可以放到代码块中,提高代码重用性
普通代码块:先于构造函数执行,且每实例化一个对象就被隐式调用一次
静态代码块:随着类的加载而执行,先于构造代码块执行,且只会执行一次
静态代码块只能调用静态成员;普通代码块可以调用任意成员class Person { static int count; String name; int age; String getName() { return "guangdong "+name; } static {//静态代码块 System.out.println("static block"); } {//普通代码块 System.out.println("construct block"); count ++; } /* construct method */ public Person () { System.out.println("construct method: Person 1"); name = "null"; age = 0; } static void printPerson () { System.out.println("This is a class of Person"); } };
public class Oop5 { public static void main(String args[]) { Person p3 = new Person(); System.out.println(p3.getName()); Person.printPerson(); System.out.println(Person.count); } }