面向对象/传值和传引用/java字符串长度限制因素

一.面向对象程序设计
定义:把现实世界中的事物抽象为 “对象” 进行程序设计
面向过程到面向对象的转变:编程的终极目标是解决问题,解决现实生活中的问题,人们一开始编程是对 基本数据类型 进行操作,但是有时候需要将几个数据项进行统一操作,例如一个学生的姓名,学号等数据,人们希望对每个学生的姓名学号进行统一操作,于是出现了C语言中的结构体,这相对于单纯的操作基本数据类型方便了许多,但是这还不够方便,人们不但把多个数据项集成在一起,而且还把对这些数据项的操作结合起来,这样极大的提高了代码的可重用性,也极大地降低了代码的耦合。
在这里插入图片描述

何为对象? 对象是指有自己特性的任何事物,是类的一个实例,例如A的女朋友是一个对象,B的女朋友也是一个对象。

何为? 类是一个模板,它描述了一类对象的行为和状态。例如,女朋友就是一个类,这个类的属性有身高,体重等(数据域),特有的操作有吃饭,睡觉等(成员方法)。
类的结构:

class GirlFriend{
    private double height;   //数据域
    private double weight;
    static{        //静态代码块
    }
    {      //代码块
    }
    public GirlFriend(double height,double weight){    //构造方法
         this.height = height;
         this.weight = weight;
    }
   public void eat(){       //成员方法
   }
   public void sleep(){
   }
}

我们知道创建对象的操作为:类名 变量名 = new 类名();
但是在创建对象的过程中类代码的执行顺序是怎样的呢?

class GirlFriend{
    private double height;
    private double weight;
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("代码块");
    }
    public GirlFriend(){
        System.out.println("构造方法");
    }
    public void eat(){
        System.out.println("成员方法");
    }
}
public class Test {
    public static void main(String[] args){
        new GirlFriend().eat();
    }
}
运行结果
========================================================
静态代码块
代码块
构造方法
成员方法
GirlFriend g = new GirlFriend();
1.GirlFriend.class加载入内存
2.声明一个GirlFriend类型引用g
3.在堆内存创建对象
4.给对象中的数据域默认初始化值
5.属性进行显式初始化
6.构造方法进栈,对对象的属性赋值,构造方法弹栈
7.将对象的地址赋给g

二.传值和传引用
传值:对于一些简单的基本数据类型参数传递应选择值传递

传引用实质上是将对象在堆内存中的地址赋给引用变量):对于一些比较复杂的对象参数传递应选择引用传递,因为对象的数据复杂且有不可预知性。但是在有些情况下需要传递对象,而不能单纯的传递对象的引用,比如接受参数的主体对于该对象所在的堆内存没有访问权限,这时候就需要进行对象传递。
三.基本数据类型的自动装箱和拆箱机制

如果一个基本类型值出现在需要对象的环境中,编译器会将基本类型值进行自动装箱;如果一个对象出现在需要基本类型值的环境中,编译器会将对象进行自动拆箱。

Integer intObject = new Integer(2);  <=>  Integer intObject = 2;(自动装箱)



Integer[] intArray = {1,2,3};
System.out.println(intArray[0] + intArray[1] + intArray[2]);(自动拆箱)

四.字符串
①字符串长度受什么限制
从源代码可以看出字符串类型底层是一个byte类型数组

private final byte[] value;
在这里插入图片描述
String类中有很多个重载的构造方法,其中有几个是允许用户传入length来定义长度的
在这里插入图片描述
由于length是int类型的,那么字符串长度限制是不是就是Integer.MAX_VALUE?我们通过一个例子来看
在这里插入图片描述
这个用例的字符串长度大约是47万,远小于 2^31-1(Integer.MAX_VALUE),但是仍然报错“字符串长度过长”

常量池限制: 之所以会出现这个结果,是因为JVM规范对常量池有所限制。常量池中的每一种数据项都有自己的类型。其中string_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一组Unicode码点序列,这组码点序列最终会被初始化为一个String对象

CONSTANT_Utf8_info{
   u1 tag;
   u2 length;
   u1 byte[length];
}

u2表示长度为两个字节(16位)的无符号数, 所以字符串常量的长度不能超过2^15 - 1 = 65535. 最大值为65534

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值