面向对象基础
Posted 赤苇弥生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象基础相关的知识,希望对你有一定的参考价值。
创建对象的流程
当你使用构造器的时候
- 在方法区加载类的信息 ( 无论new多少次只会加载一次)
- 在堆中开辟空间存放属性信息
- 属性初始化 ( int = 0 , String = null )
- 属性赋值 ( age = 9 )
- 构造器赋值
- 栈中引用 ( 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);
以上是关于面向对象基础的主要内容,如果未能解决你的问题,请参考以下文章