面向对象基础

这篇博客详细解析了Java中对象创建的过程,包括类加载、堆内存分配、栈中引用以及构造器的作用。讨论了基本类型和引用类型参数传递的区别,并介绍了对象克隆的方法。此外,还阐述了`this`关键字的使用场景及其本质。
摘要由CSDN通过智能技术生成

创建对象的流程

当你使用构造器的时候

  1. 在方法区加载类的信息 ( 无论new多少次只会加载一次)
  2. 在堆中开辟空间存放属性信息
    1. 属性初始化 ( int = 0 , String = null )
    2. 属性赋值 ( age = 9 )
    3. 构造器赋值
  3. 栈中引用 ( p 指向 Person对象 )

对象在内存中的存在形式

  • 现在方法区进行类的加载( 无论使用类创建对象多少次 , 只进行一次加载 )
  • 创建类的对象时在栈进行对象名的创建 , 在没有new之前指向null , new之后指向堆中的区域
  • 堆中的属性若为字符串则再指向方法区中的常量池
  • 对象名不是真的对象 , 他指向的堆中的区域才是对象 , 对象名也叫对象的引用

对象和对象引用的内存分配机制

  • 首先在方法区加载类
  • 当先命名在new时候 , 在栈中创建p1 , new之后再堆中指向一个赋默认赋值的空间 (在没有赋值之前)
  • 当命名同时new时候 , 现在堆中开辟空间 , 然后将地址给p1
  • 对对象赋值 , 在给String赋值之前String成员变量为null , 赋值之后指向方法区的常量池的量
  • 创建p2指向p1的区域 , p2和p1影响作用同一片区域
  • 注意 , 当p2=null(赋值)时 , 就只有p1指向对象空间 , 而不是对象空间解散

java的内存结构分析

成员方法

方法调用的内存分析

退出方法后 , 方法栈将消失

方法的使用细节

返回值

  • 一个方法只能有一个返回值 , 如果需要返回多个值 , 可以采用数组的方式返回 , 同时接收的返回值也需要匹配(兼容)


限定修饰符

可以不赋限定符 , 不赋则是默认

方法命名

用驼峰法 , 即先小 , 后面大

方法不能嵌套定义

不能在方法中定义方法 , 但是可以在方法中使用方法

方法在不同地方的调用

在同一个类中可以直接调用 ( 无视修饰符 ) , 在不同类中要创建对象再调用

成员方法传参机制

基本数据类型的传递

进行的是值拷贝 , 形参的变化不影响实参

例如在方法中进行基本数据类型的交换不会影响到实参

引用数据类型的传递

引用类型传递的是地址 , 可以通过形参来影响实参

这里的传递指的是传入方法的参数 , 可以是数组 ,可以是类

当在方法中重新指向一个对象时

当我将传入的对象置空时 , 我是将形参指向对象实体的路给切断了 , 对实参没有影响

同样的 , 当我将传入的对象指向一个新的对象实体时 , 对实参对象也没有影响 , 在方法结束之后 , 形参回收 , 在方法中创建的形参指向的空间成为垃圾空间

克隆对象

传出对象

public class kelongduixiang {    public static void main (String[] args) {        AA a = new AA();        AA c ;//c可以不new空间 , 后面会给他一个地址值        BB b = new BB();        a.q = 1 ;        a.w = 'a';        a.r = "aww";        c = b.opop (a);        System.out.println (c.q);    }}class AA{    int q ;    char w ;    String r ;}class BB{    public AA opop(AA a){        AA b = new AA ();        b.q = a.q;        b.r = a.r;        b.w = a.w;        return b;    }}

注意 , 在方法中的对象b ,在执行完方法后就无了

在对象内克隆

public class kelongduixiang {    p 广西红色教育培训 www.hnganxun.cn ublic static void main (String[] args) {        AA a = new AA();        AA c = new AA();        BB b = new BB();        a.q = 1 ;        a.w = 'a';        a.r = "aww";        b.opop (a,c);        System.out.println (c.q);    }}class AA{    int q ;    char w ;    String r ;}class BB{    public void opop(AA a,AA b){        b.q = a.q;        b.r = a.r;        b.w = a.w;    }}

this

this可以访问父类的方法和属性!!!!是从本类开始找不是只找本类 , 但是如果本类已经有了就不会再找同名的了

super可以找超类!!

this的抽象理解

this 就是 " 我的 " , 指的是当前调用方法的对象 , 例如

this的本质

this 其实就是对象 , 那个对象调用就是那个对象 , 可以使用 hashcode

this的用法

this 可以修饰 当前类的成员变量 , 局部变量 , 构造器 , 方法

this修饰方法

public class ttest {    public static void main(String[] args) {        Son son = new Son();        son.f2();    }}class Futher{    public void f1(){        System.out.println("父类方法调用");    }}class Son extends Futher{    public void f1(){        System.out.println("子类方法调用");    }    public void f2(){        f1();        super.f1();        this.f1();    }}//子类方法调用//父类方法调用//子类方法调用

this修饰构造器

用于访问本类的其他构造器 , 使用时 this 修饰的构造器必须在最前面 , 而且不加 .

只能在构造器中使用 , 不能在普通方法中调用

class Futher{    public Futher(int a ) {        System.out.println(a);    }    public Futher() {        this(1);//this调用其他构造器只能使用一次不能出现两个this构造器调用        //因为this构造器调用必须要遭第一个,而二次this调用必然有一个在第二句        System.out.println("无参调用");    }}

this修饰属性

当有局部变量干扰时 , 可以准确访问到属性

int aa = 3;public Futher(int a) {    System.out.println(a);}public Futher() {    this(1);    System.out.println("无参调用");}public void f3() {    int aa = 1;    System.out.println(" " + aa + " " + this.aa);}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值