众所周知,JAVA是一种面向对象的编程语言,因而类和对象的概念至关重要,成为了JAVA语言体系的“基石”,本文将梳理类和对象的概念并列举出一个类中可以包含哪些东西。
一、类和对象的概念
类:是一种抽象且具有相同相似属性特征、行为方式和功能的一类事物的信息描述。如:汽车类、用户类、学生类等。
对象:指具体的事物,可以理解为一种类类型的变量。如:汽车类可实例化为小刘的奔驰车、老王的奥迪车、老李的宝马车等;用户类可实例化为用户1(刘哥)、用户2(王哥)、用户3(李哥)等;学生类可实例化为刘同学、王同学、李同学等。
将视角投到计算机内存中,类是一个静态的不占内存,对象则是动态的占用内存,不同的对象存在着独特的属性(刘哥王哥的身高不同,王哥李哥的体重不同,刘哥李哥的工作不同等)和行为(刘哥说话,王哥吃饭,李哥打游戏等),需要占用一定的内存空间存储。通俗讲,一个抽象的概念不占地,实例化成一个实实在在的东西后很占地。因此,实例化对象时需要动态new一片内存空间。
二、类中有什么
简言之一个类中包含了属性和方法两大要素,细分为:朴素的不加任何修饰的属性和方法、加不修饰词(static、final)的属性和犯法、代码块和构造方法,可以具体包含了以下几种情况:
1、经static修饰的属性、方法和代码块
static是“静态”的意思,具有唯一性。经static修饰过的成员(属性、方法、代码块)属于类而不属于对象,因此不需要实例化也可由类名直接调用。在程序开始执行时, 静态的成员就会被加载到内存中,因而可以快速稳定的调用。
静态属性:有且仅有一个值,任何一次的修改都是全局性修改。
静态方法:可直接访问所属类的静态方法和静态属性,但不能访问所属类的实例方法和实例属性,因此不能使用this关键字。区别于普通方法,普通方法需要加载类后 new出一片新的内存空间存储实例化对象,静态方法可不经实例化由类名直接访问。
静态代码块:在类被加载时优先于其他成员执行,且只执行一次。如果由代码需要在程序启动时执行,需要静态代码块。区别于静态方法,虽然二者都是在程序开始执行 时被加载到内存中,但是静态方法需要通过类名或对象名才可以被动访问,而静态代码块更像是自动、主动执行。区别于普通代码块,普通代码块在实例化对象的时候自动执行, 静态代码块在加载类时自动执行。
public class Boy { //静态属性 static String gender = "男"; //静态方法 static void showStaticMember (){ System.out.println("正在执行静态方法:"+"Boy类的静态属性gender为"+gender); } //静态代码块 static { System.out.println("正在执行静态代码块"); } //程序入口 public static void main(String[] args){ //类名直接调用静态成员 System.out.println("静态属性被调用"+"Boy类的静态属性gender为"+Boy.gender); Boy.showStaticMember(); //调用修改 Boy.gender = "女"; System.out.println("静态属性被修改!"+"Boy类的静态属性gender为"+Boy.gender);} }
2、经final修饰的属性、方法和类
final是“最终”的意思,经final修饰过的成员的最终形态不可变。区别于static,final修饰的成员属于对象需要实例化后调用。
final属性:如果final修饰的是基本数据类型(整型、浮点型、字符型和布尔型)称为常量,初始化赋值后不能再调用赋值,且同一个类的不同对象都有一份自己的常量,其值相同。 如果final修饰的是引用数据类型(类、接口和数组),则该数组(类、接口)本身可以被修改,但指向数组的地址不可以被修改。
final方法:不可以被重写,但可以被继承。
final类:不可以被继承,如字符串String类。
public class Boy{ final String gender = "男" ; //引用数据类型,需立即赋值,否则编译器会报错 final int num = 2021001001; //基本数据类型,常量 //final方法 final void showGender(){ System.out.println("正在执行final方法!"); } //final类 final class BoyClass{} public static void main(String[] args) { //实例化后调用final Boy liuGe = new Boy(); System.out.println("常量被调用!"+"Boy类的静态属性gender为:"+liuGe.gender); liuGe.showGender(); }}
3、构造方法
一种特殊的方法,在一个类实例化时调用的方法,可构造出一个类的实例并完成初始化。分为无参数的构造方法和有参数的构造方法。每个类都有一个隐式的空参数的构造方法,同时当一个类有多个构造方法时编译器自动按照实例化后括号中参数的个数和类型对应执行。
public class Boy{ String name; int num; double score; //构造方法 public Boy(){ System.out.println("正在执行空参数的构造函数!"); }; //空参数的构造方法 //含参数的构造方法 public Boy(String nam, int nm, double score){ System.out.println("正在执行含参数的构造函数!"); name = nam; num = nm; this.score = score; } public void showInfo(){ System.out.println(name+"的学号为:"+num+",分数为:"+score); } //程序入口 public static void main(String[] args){ //实例化对象 Boy liuGe = new Boy(); Boy wangGe = new Boy("王哥",2017001001, 90); wangGe.showInfo(); }}
4、执行顺序
static属性->static代码块->主函数->成员属性->非静态代码块->构造方法->非静态方法
public class Boy{ //属性 int num; //方法 public void testFunction (){ System.out.println("普通方法"); } //无参数的构造方法 public Boy (){ System.out.println("无参构造方法"); } //含参数的构造方法 public Boy(int num) { System.out.println("含参构造方法"); this.num = num; } //普通代码块 { System.out.println("普通代码块"); } //静态代码块 static { System.out.println("静态代码快"); } //静态变量 static String name; //静态函数 static void showStaticInfo(){ System.out.println("静态方法"); } //常量 final String finalData = "常量"; //final方法 final void finalFunction(){ System.out.println("final方法"); } public static void main(String[] args) { Boy liuGe = new Boy(); Boy wangGe = new Boy(2017001001); System.out.println(wangGe.finalData); } }