Java系列8—对象创建的内存分配和构造方法

对象的创建

  1. 类和对象的区别

    面向对象【java语言的核心机制,最重要的内容,java语言的特色】
        * 面向过程和面向对象的区别
        -- 面向过程:主要关注点是:实现的具体过程,因果关系
    
    	-- 面向对象:主要关注对象【独立体】能完成哪些功能。
    	    优点:耦合度低,扩展力强。
    	    缺点:前期投入成本较高,需要进行独立体的抽取,大量的系统设计
        
    	-- c语言是纯面向过程的、C++半面向对象、java纯面向对象
    
        * 面向对象的三大特性
        —— 封装
    	—— 继承
    	—— 多态
    	面向对象的分析:OOA
    	面向对象的设计:OOD
    	面向对象的编程:OOP
    
        * 类和对象的概念
          * 什么是类?
             —— 类是一个概念,又名类型,代表了一类事物
    	 —— 在现实世界当中,对象A与对象B具有共同特征,进行抽象总结出的模板
          
          * 对象?
             —— 是实际存在的个体。现实当中实际存在
          
          类——>【实例化】——>对象
    
          对象又被称为实例/instance
    
          对象——>【抽象】——>类
    
          * 一个类主要描述什么信息呢?
          	一个类主要描述的是状态+动作。
        * 类的定义
          语法结构:
          [修饰符列表] class 类名{
          }
    
  2. java虚拟机内存分配

    1、JVM(Java虚拟机)主要包括三块内存空间,分别是:栈内存、堆内存、方法区内存
    
    2、堆内存和方法区内存各有一个,一个线程一个栈内存。
    
    3、方法调用的时候,该方法所需要的的内存空间在栈中分配,称为压栈。方法结束之后,
       该方法所属内存空间释放,称为弹栈。
    
    4、栈中主要存储的是方法体当中的局部变量。
    
    5、方法的代码片段以及整个类的代码片段都被存储在方法区内存当中,在类加载的时候,
       这些代码片段会载入。
    
    6、在程序执行过程中使用new运算符创建的java对象,存储在堆内存中.对象内部有实例,
       所以实例变量存在堆内存中.
    
    7、变量分类:
    	- 局部变量【方法体中声明】
    	- 成员变量【方法体外声明】
    		实例变量【前边修饰符没有static】
    		静态变量【前边修饰符中有static】
    
    8、静态变量存储在方法区内存当中
    
    9、三块内存变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对堆内存。
    
    10、垃圾回收器【自动垃圾回收机制,GC机制】
    	* 当堆内存当中的java对象成为垃圾数据的时候,会被垃圾回收器回收。
    	* 什么时候会变成垃圾呢?
    		没有更多的引用指向它的时候
    		这个对象无法被访问,因为访问对象只能通过引用的方式
    
    

在这里插入图片描述

  1. 对象的创建和使用

    /*
    	对象的创建和使用
    */
    
    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;
    
    }
    
  2. 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的方法");
    	}
    }
    
    

猜你喜欢

转载自blog.csdn.net/qq_42486675/article/details/106507765