一,类的封装
思维导图:
类的封装是很重要的概念,它为类的继承提供了基础,使得Java程序变得可扩展,更有利于维护,上面的思维导图逻辑较为清晰得表述了这一方面的内容
面向对象类封装的模块化和可维护性比面向过程做的要好很多。而面向对象的最主要的特征可扩展性也是C语言本身所不具有的。
所以在处理复杂的、用户需求多变(要求可维护、可扩展)的系统开发时,面向对象Java语言是主要的技术手段。
四,类封装代码
程序1:
//类对数据结构和对数据结构操作的方法进行了封装,是面向对象中最小的模块。//模块化是解决"复杂系统"的技术手段。//面向对象的封装类具有"可维护性"//面向对象思想的核心是“可扩展性”//用户需求的多变性要求软件系统具有"可维护性"和“可扩展性”//面向对象思想的"可维护性"和“可扩展性”是解决用户需求的多变性的技术手段//所以纯面向对象Java语言具有"模块化"、"可维护性"和“可扩展性”特征,是解决复杂的、用户需求多变性的系统的技术手段//类定义,Student类名是类的数据结构的入口地址class Student {//类成员定义 //1、类的静态成员,类中声明使用static修饰符的成员。 //就是说这个成员的拥有者不是对象而是类 //1-1、Student类的静态代码块(静态构造方法) //定义:这个方法没有方法名,没有形参,没有返回值,不能进行方法调用。 //调用:静态代码块在类初次被加载到JVM中时,会按照static块的顺序来执行每个static块, // 并且每个static块只会执行一次。 //作用:静态代码块通常用于初始化静态变量,也可以进行其它初始化操作。 static{ System.out.println("静态字段默认初始化 className = " + Student.className); System.out.println("静态字段默认初始化 classID = " + Student.classID); //静态代码块初始化 classID = 1; System.out.println("静态代码块1 classID = " + Student.classID); } static{ classID = 2; System.out.println("静态代码块2 classID = " + Student.classID); } //1-2、静态字段(相当于C语言的全局变量),默认初始化、静态块初始化、声明初始化 //初始化过程:默认初始化 ---〉 静态块初始化 ---〉 声明初始化 public static int classID = 1; public static String className = "班级"; //1-3、静态方法(相当于C语言的全局函数) public static void showClassID(){ System.out.println("调用Student.showClassID(),班级ID号是:" + classID); } //2、类的实例成员,类中声明不使用static修饰符的成员。 ////就是说这个成员的拥有者不是类而是对象 // 2-1、实例构造方法(方法名与类名相同),只能由new调用,this引用刚创建的实例对象,不能进行方法调用。 //如果访问一个变量只有一个名称,编译器首先假定它是局部变量/形参变量, //其次假定它是实例变量this.变量,最后假定它是全局变量类名.变量 public Student(int studentID,int age,String name) { System.out.println("实例字段默认初始化 studentID = " + this.studentID); System.out.println("实例字段声明初始化 age = " + this.age); System.out.println("实例字段默认初始化 name = " + this.name); this.studentID = studentID; this.age = age; this.name = name; System.out.println("实例字段实例构造方法初始化"); } //2-2、实例字段集合定义了一个新的实例数据结构 //实例字段 //初始化过程:默认初始化 ---〉 声明初始化 ---〉 实例构造方法初始化 //默认初始化 int studentID; //声明初始化 int age = 18; String name; // 2-3、实例方法,对于该类创建的实例对象和该类派生类创建的实例对象的数据结构中的数据进行操作。 //this引用实例对象 public void study(){ System.out.println(this.name + "正在学习"); } // 2-3、重载实例方法 //方法名相同,形参的类型、数量、顺序不同 public void study(String partner){ System.out.println(this.name + "正在与" + partner + "一起学习"); } }//public class demo { public static void main(String[] args) { System.out.println("----------------------------------------------类的静态成员"); //1、类的静态成员 //1-1、Student类的静态代码块在JVM类加载器加载Student类时被自动调用 //1-2、操作Student类(静态数据结构)中的静态字段 //声明初始化 System.out.println("main代码块 classID = " + Student.classID); System.out.println("main代码块 className = " + Student.className); // 1-3、调用Student类的静态方法 Student.showClassID(); System.out.println("----------------------------------------------类的实例成员"); //2、类的实例成员 System.out.println("-----------------------张珊实例成员"); // 2-1、实例化一个类对象,调用实例的构造方法 Student p = new Student(1,21,"张珊"); //2-2、操作实例对象(实例数据结构)中的实例字段 System.out.println("studentID = " + p.studentID + ",age = " + p.age + ",name = " + p.name); // 2-3、调用Student类的实例方法 p.study(); p.study("比尔盖茨"); System.out.println("-----------------------李斯实例成员"); // 3-1、实例化一个类对象,调用实例的构造方法 Student p1 = new Student(2,22,"李斯"); //3-2、操作实例对象(实例数据结构)中的实例字段 System.out.println("studentID = " + p1.studentID + ",age = " + p1.age + ",name = " + p1.name); //3-3、调用Student类的实例方法 p1.study(); p1.study("马云"); } }//1、Java源程序---〉编译器编译---〉class字节码文件//2、字节码文件---〉JVM扫描---〉生成方法区的类对象//3、方法实现代码---〉解释器解释执行/编译器编译执行---〉栈区的局部变量和形参、堆区的实例对象
里面有详细的注释
运行结果:
JVM方法调用:
1)创建方法的执行环境
2)扫描方法代码,加载新类
3)取指令
4)执行
5)退出方法的执行环境,垃圾回收
执行:
加载类deom
为执行main方法建立栈帧
扫描main方法,加载新Student类
执行main方法
退出main方法的执行环境,垃圾回收
Java中static静态变量的初始化
静态代码块 --> 静态字段 --> 实例字段 --> 实例构造方法
程序2:
public class Test { public static Test1 t = new Test1(); public static int a = 0; public static int b; public static void main(String[] arg) { System.out.println(Test.a); System.out.println(Test.b); } }class Test1{ public Test1() { Test.a++; Test.b++; } }//输出:0 1
输出结果: