贵港有网站建设的公司吗,北滘大良网站制作,百度平台电话多少,自己做微网站制作教程类是对象的抽象#xff0c;是一组具有相同特性#xff08;属性#xff0c;事物的状态信息#xff09;和行为#xff08;事物能做什么#xff09;的事物的集合#xff0c;可以看做一类事物的模板。
对象是类的实例化#xff0c;是具体的事物。
比如#xff1a;人类和…类是对象的抽象是一组具有相同特性属性事物的状态信息和行为事物能做什么的事物的集合可以看做一类事物的模板。
对象是类的实例化是具体的事物。
比如人类和具体的人、厨师类和具体的厨师。
类的定义
/*** 类定义*/
权限修饰符 其他修饰符 class 类名 {成员变量;初始化代码块;构造方法;成员方法;
}权限修饰符 public、protected内部类时、默认缺省、private内部类时。
其他修饰符final最终类不可继承、abstract抽象类、static内部类。
成员变量
类变量 / 静态变量
使用 static 关键字修饰类本身具有的属性不依赖具体的实例对象有默认值参考数组。
类的内部可以直接访问外部可以通过类名访问类名.类变量名。
类变量在类加载时进行初始化只有一份数据即类的所有实例对象共享类变量。 public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0}
}class Human {public static int POPULATION;
}实例变量
实例对象具有的属性依赖具体的实例有默认值参考数组。
在类的内部可以直接访问和局部变量存在命名冲突时适用就近原则此时可以通过 this.实例变量名 访问外部可以通过实例对象访问实例名.实例变量名。
实例变量在创建实例对象时进行初始化每个对象都有自己的实例数据。
this指代当前实例对象可以通过 this 访问属性、成员方法、构造方法还能作为参数传递给其他方法。
public class Test1 {public static void main(String[] args) {System.out.println(Human.POPULATION); // 默认值 0Human human new Human();System.out.println(human.POPULATION); // 实际会转为通过类 Human 访问System.out.println(human.age); // 默认值 0}
}class Human {public static int POPULATION;public int age;
}成员变量和局部变量
成员变量定义在类上局部变量定义在方法或代码块中。
默认值成员变量有默认值局部变量没有默认值。
作用域成员变量的作用域是类局部变量的作用域是定义的方法或代码块内部。
初始化代码块
静态初始化代码块
用于静态变量的初始化类加载时执行。
public static int POPULATION;static {POPULATION 100;
}实例初始化代码块
创建实例对象时执行的代码块主要用于实例变量的初始化在构造方法之前执行。
public int age;{age 20;
}成员方法
类方法 / 静态方法
使用 static 关键字修饰类本身具有的行为不依赖具体的实例可以通过类名调用类名.类方法名不能访问实例成员只能访问静态成员。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}
}实例方法
实例对象具有的行为依赖具体的实例只能通过实例对象调用实例名.实例方法名可以访问静态成员和实例成员对静态成员的访问实际会转为通过类访问。
实例方法中有一个隐含的参数就是 this指向当前调用方法的对象实例。
public class Human {public static int POPULATION;public int age;public static void test1(){System.out.println(POPULATION); // 不能直接访问实例变量 age}public void test2(){System.out.println(POPULATION);}
}构造方法
修饰符 类名作构造方法名(){// 无参构造方法
}修饰符 类名作构造方法名(参数列表){this.属性名 参数;
}构造方法用于创建对象时初始化实例对象属性调用构造方法不代表会生成对象。
构造方法名与类名相同没有返回值类型声明可重载。
构造方法中可以使用 this(...) 调用其他的构造方法但必须在第一行调用这是为了避免误操作先调别的然后根据情况自己再做调整。
无参构造方法
默认构造方法如果类没有显式声明构造方法编译时会自动生成一个无参的构造方法如果有显式声明则不会自动生成无参构造方法。
有参构造方法
// 无参构造方法
public Human(){this(null,0); // 可以通过 this 调用其他构造方法
}// 有参构造方法
public Human(String name,int age){this.name name; // 此处 this 指代当前对象this.age age;
}⭐对象创建
通过关键字 new 调用类的构造方法创建对象。
public static void main(String[] args){Human human new Human(王炸25);
}类加载过程 类的加载是指 JVM 将类的相关信息加载到方法区内存为这个类分配一块空间存储类的定义、成员变量和方法信息并对静态变量赋初始值。
在 Java 中类是动态加载的当第一次通过 new 创建一个类的对象时或者第一次直接通过类名访问类变量或类方法时才会加载该类加载一个类时会查看其父类是否已加载如果没有则还会加载其父类。
类加载进内存后一般不会释放直到程序结束所以静态变量在内存中只有一份。
1分配内存方法区内存保存类的信息成员变量、成员方法、初始化代码、父类信息引用
2给类变量赋默认值
3加载父类设置父子关系
4执行类初始化代码先初始化父类部分。
对象创建过程
当通过 new 创建一个对象的时候对象产生在堆内存中会存储这个对象的实例值每做一次 new 操作就会产生一个对象。
每个对象除了保存实例变量的值外还保存着对应类型即类的地址这样通过对象就能知道它的类访问到类的信息。
1分配内存保存对象信息堆内存
2对所有实例变量赋默认值
3执行实例初始化代码先初始化父类部分。
对象内存分析 human 在内存中大概如图所示new 出来的对象实际在堆内存中栈内存中的变量 human 存储的是对象在堆内存中的 地址。
当没有变量引用 0x1234 指向的对象时该对象将等待垃圾回收机制处理具体释放时间由 JVM 决定。 参考《Java 编程的逻辑》 马俊昌