方法 就是我们曾经学过的方法 用于描述对象的行为
但是 方法中还有一种特殊的方法,方法名字和类相同,用于对象的初始化。
构造方法是一种特殊方法,使用关键字new在实例化对象的过程中会被自动调用
new执行过程
●为对象分配内存空间
●调用对象的构造方法
语法规则
1.方法的名称和类名必须相同
2.构造方法没有返回值的类型
3.每一个类都会有一个构造方法(若没有则系统会自己生成构造方法)
class Person {
private String name;//实例成员变量
private int age;
private String sex;
//默认构造函数 构造对象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//带有3个参数的构造函数
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 p1 = new Person();//调用不带参数的构造函数 如果程序没有提供会调用不带参数的构造函数
p1.show();
Person p2 = new Person("zhangfei",80,"男");//调用带有3个参数的构造函数
p2.show();
}
}
// 执行结果
name: caocao age: 10 sex: 男
name: zhangfei age: 80 sex: 男
static关键字
一.修饰属性
在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据。只有通过new
关键字创建该类的实例化对象后,系统才会为每个对象分配内存空间,存储各自的数据。
有时候,开发人员会希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例
化对象所共享。这时候就可以用static来修饰属性。此时被static修饰的属性属于类而不属于对象,
被所有对象共享
。
访问方式
1.类名
每new一个对象,系统就会分配内存,并且只能用来修饰成员变量,不能修饰局部变量
public class Student{
public void study(){
static int num=10; //编译会报错
}
}
二、用来修饰方法
如果在任何方法上应用
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);
}
}
三、修饰代码块
什么是代码块
根据代码块定义的位置以及关键字,又可分为以下四种:
1.普通代码块
2.构造代码块
3.静态代码块
4.同步代码块(暂时还没学到)
1.普通代码块
普通代码块:定义在方法中的代码块
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
2.构造代码块 (实例代码块)
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
class Person{
private String name;//实例成员变量
private int age;
private String sex;
public Person() {
System.out.println("Person ()!");
}
//实例代码块
{
this.name = "tig";
this.age = 12;
this.sex = "man";
System.out.println(" instance ()!");
}
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();
}
}
// 运行结果
instance ()!
Person ()!
name: tig age: 12 sex: man
注意:实例代码块优先于构造函数执行
3.静态代码块
使用 static 定义的代码块。 一般用于初始化静态成员属性。
class Person{
private String name;//实例成员变量
private int age;
private String sex;
private static int count = 0;//静态成员变量 由类共享数据 方法区
public Person(){
System.out.println(" Person ()!");
}
//实例代码块
{
this.name = "tig";
this.age = 12;
this.sex = "man";
System.out.println(" instance ()");
}
//静态代码块
static {
count = 10;//只能访问静态数据成员
System.out.println(" static ()");
}
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();//
}
}
//结果
static ()
instance ()
Person ()!
instance ()
Person ()!
注意事项
静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。静态代码块执行完毕后 , 实例代码块(构造块)执行,再然后是构造函数执行。