对象的创建
-
类和对象的区别
面向对象【java语言的核心机制,最重要的内容,java语言的特色】 * 面向过程和面向对象的区别 -- 面向过程:主要关注点是:实现的具体过程,因果关系 -- 面向对象:主要关注对象【独立体】能完成哪些功能。 优点:耦合度低,扩展力强。 缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统设计 -- c语言是纯面向过程的、C++半面向对象、java纯面向对象 * 面向对象的三大特性 —— 封装 —— 继承 —— 多态 面向对象的分析:OOA 面向对象的设计:OOD 面向对象的编程:OOP * 类和对象的概念 * 什么是类? —— 类是一个概念,又名类型,代表了一类事物 —— 在现实世界当中,对象A与对象B具有共同特征,进行抽象总结出的模板 * 对象? —— 是实际存在的个体。现实当中实际存在 类——>【实例化】——>对象 对象又被称为实例/instance 对象——>【抽象】——>类 * 一个类主要描述什么信息呢? 一个类主要描述的是状态+动作。 * 类的定义 语法结构: [修饰符列表] class 类名{ }
-
java虚拟机内存分配
1、JVM(Java虚拟机)主要包括三块内存空间,分别是:栈内存、堆内存、方法区内存 2、堆内存和方法区内存各有一个,一个线程一个栈内存。 3、方法调用的时候,该方法所需要的的内存空间在栈中分配,称为压栈。方法结束之后, 该方法所属内存空间释放,称为弹栈。 4、栈中主要存储的是方法体当中的局部变量。 5、方法的代码片段以及整个类的代码片段都被存储在方法区内存当中,在类加载的时候, 这些代码片段会载入。 6、在程序执行过程中使用new运算符创建的java对象,存储在堆内存中.对象内部有实例, 所以实例变量存在堆内存中. 7、变量分类: - 局部变量【方法体中声明】 - 成员变量【方法体外声明】 实例变量【前边修饰符没有static】 静态变量【前边修饰符中有static】 8、静态变量存储在方法区内存当中 9、三块内存变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对堆内存。 10、垃圾回收器【自动垃圾回收机制,GC机制】 * 当堆内存当中的java对象成为垃圾数据的时候,会被垃圾回收器回收。 * 什么时候会变成垃圾呢? 没有更多的引用指向它的时候 这个对象无法被访问,因为访问对象只能通过引用的方式
-
对象的创建和使用
/* 对象的创建和使用 */ public class OOTest01 { public static void main(String[] args){ // 通过一个类可以实例化N个对象 // 实例化对象语法:new 类名(); // new是java语句当中的一个运算符 // new运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 // 方法区内存在;类加载的时候,.class字节码文件被加载到该内存空间当中 // 栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈中压栈 // 堆内存:new产生的对象 // Student是一个引用数据类型 // s是一个局部变量,存储在栈内存中 // new Studnet()是一个学生对象 // s是一个局部变量,存储对象的内存地址 Student s = new Student(); // 什么是对象?new运算符在堆内存中开辟的内存空间称为对象 // 什么是引用?引用是一个变量,只不过这个变量保存了内存地址 // 访问变量实例的语法格式 // 读取数据:引用.变量名 // 修改数据:引用.变量名 = 值 int stuNo = s.no; int stuAge = s.age; String stuName = s.name; boolean stuSex = s.sex; System.out.println("姓名:"+stuNo); System.out.println("年龄:"+stuAge); System.out.println("姓名:"+stuName); System.out.println("性别:"+stuSex); s.name = "张三"; System.out.println("姓名:"+stuName); System.out.println("姓名:"+s.name); // stu也是一个引用,存储新实例的内存地址 Student stu = new Student(); System.out.println(stu); // 编译报错: // 通过实例才能访问实例变量,不能直接通过类名的格式访问 // System.out.println(Student.no); } } /* 局部变量在栈内存中存储 成员变量中的实例变量在堆内存的java对象内部存储 实例变量是一个对象一份,100个对象有100份 */
// 学生类 public class Student { // 不创建对象,变量的内存空间是不存在的 // 创建完对象之后,对象存储在堆内存中 String name; // String类型的成员变量不赋值默认为null int age; int no; boolean sex; }
-
java中的构造方法
(1)构造方法综述
package test003; /** * 关于java中的构造方法: * 1、构造方法又被称为构造函数/构造器/Constructor * * 2、构造方法语法结构: * [修饰符列表] 构造方法名(形式参数列表){ * 构造方法体; * } * * 3、普通方法 * [修饰符列表] 返回值类型 方法名(形参列表){ * 方法体; * } * 4、对于构造方法来说,返回值类型不需要指定,并且也不能写 * void,只要有void就是普通方法了 * * 5、对于构造方法来说,构造方法的方法名必须和类名保持一致 * * 6、构造方法的作用: * 构造方法存在的意义是通过构造方法的调用,可以创建对象 * * 7、构造方法怎么调用? * -- 普通方法调用:修饰符有static时候,类名.方法名; * 没有static时候,引用.方法名 * -- 构造方法:new 构造方法名(实参列表) * * 8、构造方法的返回值: * 每一个构造方法实际上执行结束之后都有返回值,但是这个"return 值";这样的语句不需要写。 * 构造方法结束的时候Java程序自动返回值。 * 并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要写。 * * 9、当一个类中没有任何构造方法的话,系统会默认产生一个无参数的构造方法,这个构造方法被称为缺省构造器。 * * 10、建议开发中手动为当前类提供无参数构造方法 * * 11、构造方法支持重载机制,在一个类当中编写多个构造方法。 * * 12、构造方法不能使用 */ public class ConstructorTest01 { public static void main(String[] args) { // 创建User对象; // 只要构造方法调用,就会创建对象,以下创建两个对象,在堆内存中 User u = new User(3); new User(); new User("hello"); // 带有static的方法有两种调用形式 u.doSome(); User.doSome(); // 不带static的方法要使用引用.方法,名调用 u.doOther(); }
(2)、构造方法的作用
package test003; /** * 构造方法的作用: * 1、创建对象 * 2、创建对象的同时,初始化实例变量的内存空间 * * 成员变量之实例变量,属于对象级别的变量,这种变量必须现有对象才能有实例变量。 * 实例变量的内存空间是在构造方法的执行过程中完成开辟的 * 系统在默认赋值的时候,也是在构造方法执行过程中完成赋值的。 * * 实例变量是存储在JVM的堆内存内部 * */ public class ContructorTest02 { public static void main(String[] args) { Account a = new Account(); System.out.println(a); Account a1 = new Account("110"); System.out.println(a1); System.out.println("账户是:"+a1.getActno()); } } // 账户类 public Account { // 账户 private String actno; private double balance; public Account() { // 初始化实例变量的内存空间 // actno = null; // balance = 0.0 } public Account(String s) { actno = s; } public String getActno() { return actno; } public void setActno(String actno) { this.actno = actno; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
package test003; /** * 这是一个User类 * */ public class User { public User() { System.out.println("无参数的User构造器"); } // 定义有参数的构造方法 public User(int age) { System.out.println("带有Int类型参数的构造器"); } public User(String s) { System.out.println("带有String参数的构造器"); } public static void doSome() { System.out.println("带有static的方法"); } public void doOther() { System.out.println("不带static的方法"); } }