面向对象基础

Posted 赤苇弥生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象基础相关的知识,希望对你有一定的参考价值。

创建对象的流程

当你使用构造器的时候

  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 
    public 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);

以上是关于面向对象基础的主要内容,如果未能解决你的问题,请参考以下文章

面向对象基础

Java基础---面向对象

Python基础(二十):面向对象基础

Python基础(二十):面向对象基础

面向对象基础一

面向对象基础