目录
static关键字
1修饰属性
2修饰方法
final
构造方法
基本语法
this关键字
代码块
定义
普通代码块
构造代码块
静态代码块
匿名对象
toString
总结
static关键字
1修饰属性
Java的静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个静态属性.
举例
class TestDemo{ public int a; public static int count;}public class Main{ public static void main(String[] args) { TestDemo t1 = new TestDemo(); t1.a++; TestDemo.count++; System.out.println(t1.a); System.out.println(TestDemo.count); System.out.println("============"); TestDemo t2 = new TestDemo(); t2.a++; TestDemo.count++; System.out.println(t2.a); System.out.println(TestDemo.count); }}
上面的代码输出结果是:
1
1
============
1
2
为什么呢?-----count成员属性被static修饰后,属于类不属于具体的对象,而a属于具体的对象。
关系如下图所示:
2修饰方法
如果在任何方法上应用 static 关键字,此方法称为静态方法。
静态方法属于类,而不属于类的对象。
可以直接调用静态方法,而无需创建类的实例。
静态方法可以访问静态数据成员,并可以更改静态数据成员的值。
静态方法不可以访问非静态数据成员。
举例
class TestDemo{ public int a; public static int count; public static void change() { count = 100; //a = 10; error 不可以访问非静态数据成员 }}public class Main{ public static void main(String[] args) { TestDemo.change();//无需创建实例对象 就可以调用 System.out.println(TestDemo.count); }}
final
被final修饰的成员属性叫做常量,属于对象,被final修饰后,后续不可被修改。
被final和static同时修饰的成员属性叫做静态常量,属于类本身,只有一份,后续不可被修改。
构造方法
基本语法
构造方法是一种特殊方法, 使用关键字new实例化新对象时会被自动调用, 用于完成初始化操作.
new 执行过程
为对象分配内存空间
调用对象的构造方法
语法规则
1.方法名称必须与类名称相同
2.构造方法没有返回值类型声明
3.每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)。
注意事项
如果类中没有提供任何的构造函数,那么编译器会默认生成一个不带有参数的构造函数
若类中定义了构造方法,则默认的无参构造将不再生成.
构造方法支持重载. 规则和普通方法的重载一致 .
this关键字
this表示当前对象引用(注意不是当前对象). 可以借助 this 来访问对象的字段和方法。
可以使用this调用构造函数,但是要放在第一行!!!
举例
class Person { private String name;//实例成员变量 private int age; private String sex; //默认构造函数 构造对象 public Person() { //this调用构造函数 this("bit", 12, "man");//必须放在第一行进行显示 } //这两个构造函数之间的关系为重载。 public Person(String name,int age,String sex) { this.name = name; this.age = age; this.sex = sex; } public void show() { System.out.println("name: "+name+" age: "+age+" sex: "+sex); } } public class Main{ public static void main(String[] args) { Person person = new Person();//调用不带参数的构造函数 person.show(); }}
// 输出 结果 name: bit age: 12 sex: man 代码块
字段的初始化方式有:
1. 就地初始化
2. 使用构造方法初始化
3. 使用代码块初始化
下面将讲解使用第3种方式的初始化。
定义
使用 {} 定义的一段代码.
根据代码块定义的位置以及关键字,又可分为以下四种:
普通代码块
构造块
静态块
同步代码块
普通代码块
定义在方法中的代码块。
举例
public class Main{ public static void main(String[] args) { { //直接使用{}定义,普通方法块 int x = 10 ; System.out.println("x1 = " +x); } int x = 100 ; System.out.println("x2 = " +x); } } // 执行结果x1 = 10 x2 = 100
构造代码块
定义在类中的代码块(不加修饰符),也称实例代码块。
构造代码块一般用于初始化实例成员变量。
举例
class Person{ private String name;//实例成员变量 private int age; private String sex; public Person() { System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); }}public class Main { public static void main(String[] args) { Person p1 = new Person(); p1.show(); }}
运行结果:
I am instance init()! I am Person init()! name: bit age: 12 sex: man静态代码块
使用static定义的代码块。一般用于初始化静态成员属性。
静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。
静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。
举例
class Person{ private String name;//实例成员变量 private int age; private String sex; private static int count = 0;//静态成员变量 由类共享数据 方法区 public Person(){ System.out.println("I am Person init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.sex = "man"; System.out.println("I am instance init()!"); } //静态代码块 static { count = 10;//只能访问静态数据成员 System.out.println("I am static init()!"); } public void show(){ System.out.println("name: "+name+" age: "+age+" sex: "+sex); }}public class Main { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person();//静态代码块是否还会被执行? }}
匿名对象
匿名只是表示没有名字的对象.
没有引用的对象称为匿名对象.
匿名对象只能在创建对象时使用.
如果一个对象只是用一次, 后面不需要用了, 可以考虑使用匿名对象.
举例
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); }}public class Main { public static void main(String[] args) { new Person("caocao",19).show();//通过匿名对象调用方法 }}
toString
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); }}public class Test { public static void main(String[] args) { Person person = new Person("caocao",19); person.show(); System.out.println(person); }}
运行结果:
为什么第二行打印结果是这样的呢?
为了更好的打印,需要重写Object的toString方法,即:
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 Test { public static void main(String[] args) { Person person = new Person("caocao",19); person.show(); System.out.println(person); }}
总结
一个类可以产生无数的对象,类就是模板,对象就是具体的实例。
类中定义的属性,大概分为几类:类属性,对象属性。其中被static所修饰的数据属性称为类属性, static修饰的方法称为类方法,特点是不依赖于对象,我们只需要通过类名就可以调用其属性或者方法。
静态代码块优先实例代码块执行,实例代码块优先构造函数执行。
this关键字代表的是当前对象的引用。并不是当前对象。