面向对象是软件开发方法。面向对象的概念和应用已经超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
面向过程到面向对象思想层面的转变:
类表示一个共性的产物,是一个综合的特征,而对象是一个个性的产物,是一个个体的特征。
类必须通过对象才可以使用,对象的所有操作都在类中定义。例如:类与对象的关系类似汽车图纸与汽车的关系。
类由属性和方法组成:
/** * 格式: * class 类名{ * 成员属性; * 成员管理; * } * * 类必须编写在.java文件中 * 一个.Java文件中,可以存在N个类,但是只能存在一个public修饰的类 * 原因: 一个文件只能由一个主类存在 * * .java文件的文件名称必须与public修饰的类名完全一致 * @author 孟祥宽 * */ public class Demo1 { public static void main(String[] args) { //创建对象 /** *创建对象的格式 * * 类名 对象名 = null * * 类名 对象名 = new 类名() */ Person p1 = new Person(); //赋值 对象名.属性名 = 值; p1.name = "mxk"; p1.age = 18; p1.sex = '男'; p1.say(); } } /** *表示人的类 */ class Person { //属性 String name;// 名字 int age;// 年龄 char sex;// 性别 //方法 /** * void 表示没有返回值 * 定义格式: * 返回值类型 方法名称(形参){ * 方法体 * return 返回值; * } * * 调用格式: * 对象名.方法名称(实参); */ public void say() { System.out.println("我的名字:"+name+",我的年龄:"+age+",我的性别:"+sex); } }
//计算 public int sum(int x,int y) { int z = x + y; return z; } @SuppressWarnings("unused") public void fucntionA() { if(true) { //没有返回值 return 表示结束方法 return; } System.out.println("执行完毕"); }
public class Demo2 { public static void main(String[] args) { //两本书 b1,b2 Book b1 = new Book(); Book b2 = new Book(); // 第一本书 b1.name = "金苹果"; b1.info = "讲述了果农种植金色苹果的辛勤路程."; b1.say(); // 第二本书 b2.name = "银苹果"; b2.info = "讲述了果农种植银色苹果的辛勤路程."; b2.say(); } } class Book{ String name; String info; public void say() { System.out.println("书名《"+name+"》,简介"+info); } }
存放的是:
方法区中包含了一个特殊的区域(常量池) -> 存储的是使用STATIC修饰的成员。
PC寄存器保存的是当前正在执行的JVM指令的地址。在Java程序中,每个线程启动时,都会创建一个PC寄存器。
保存本地(native)方法的地址。
存储的是对象的名字和进本数据类型的值。一个线程就是一个栈,每一个栈中的元素的都是私有的,栈里的数据先进后出。数据的大小和生存期都是确定的,缺乏灵活性。但是存取速度比堆快,仅次于CPU中的寄存器。
优点:存储速度快。
存储速度快的原因: 栈内存,通过“栈指针”来创建空间与释放空间。指针向上移动释放内存,指针向下移动创建内存。
缺点:每次移动数据都要明确移动数据的大小和范围。所以为了方便指针的移动,存储的数据大小是固定的,影响程序的灵活性。
存放的是类的对象。Java是一个纯面向对象的语言,限制的对象的创建方式:通过new关键字创建的。
New关键字:
告诉jvm,需要明确的创建一个新的对象,去开辟一块新的堆内存空间。
优点:创建对象不用考虑需要多少空间,也不用考虑占用时长。堆的内存释放是由垃圾回收器(GC)完成的。
垃圾回收器 回收规则: 当栈内存不存在此对象引用时,则视其为垃圾,等待垃圾回收器回收。
/** * 对象创建的内存细节 * * @author 孟祥宽 * */ public class Demo3 { public static void main(String[] args) { Animal a1 = new Animal(); a1.name = "狮子"; a1.info = "百兽之王"; a1.say(); Animal a2 = a1;// 复制? 并不是 /** * a1和a2是变量名称 指向的是同一个对象 */ a2.name = "老虎"; a1.say(); // 发现动物名字由狮子变成老虎 } } class Animal { String name; String info; public void say() { System.out.println("动物名字:"+name+",动物介绍:"+info); } }
运行结果: