2021-08-27面向对象基本概念(一)

面向对象基本概念(一)

java类的构造

要有明确的参数构造函数和无参构造函数,要将成员变量封装好。

数组

不能使用未开辟空间的数组

二维数组

java引用传递

数组内容是引用传递,字符串也是

数组排序

二重循环,层层比较大小交换位置,大的放后面小的放前面

所有的程序起点都可以称为客户端,使用方法封装

数组转置

尽量减少垃圾的产生

方法
System.arraycopy();//数组复制
java.util.Array.sort();//排序
对象数组

对象是引用类型,数组也是引用类型,对象数组是引用类型嵌套引用类型。

String类的基本概念

String是引用类型

两种实例化方式:

使用=直接赋值

使用构造方法实现String的实例

字符串比较

引用类型都可以使用==进行比较

但是==不能进行准确字符串比较

地址不同的String对象进行比较时,就算数值相同也返回false,因为是引用类型,所以==比较的是地址,类似于指针

还可以用equals()方法进行比较

(注意Object类,后续是重点)

字符串常量就是String的匿名对象

匿名对象是指没有栈内存指向堆空间内存,只能使用一次,之后会被GC回收

实际开发中的字符串比较用equals()

String两种实例化方法的区别

1、直接复制实例化

使用=

在内存中开辟一块堆内存,栈内存将直接引用堆内存空间,在如果在内容相同的情况下,再重新声明一个相同String只是将新的变量,即栈内存直接引用已经开辟好的堆原有的堆内存,不会开辟新的空间。

这里体现了Sting类的共享设计模式,JVM中此字符串对象会被保存在对象池中,等待多次被引用

2、构造方法实例化

使用new关键字一定会开辟堆内存,不会复用。

在这个过程中,首先在堆内存中开辟一块空间来保存要构造后的字符串(String匿名对象),然后使用关键字new,开辟另一块堆空间:即真正的构造后所在的空间。之前声明的字符串会被当成垃圾被GC回收。

故会产生内存的浪费,一块会成为垃圾多用一倍内存·,也不会进入对象池。

如果希望构造方法实例化也进入对象池:

String stra = new String("").intern();

intern()方法

字符串一旦定义就不可修改

如果重新赋值,堆内存中的数据不变,重新开辟堆内存,指向了另外一个字新的符串,本质是字符串对象引用变更,最终没有被引用的内存最后变成垃圾空间,最后被GC回收,开发中应该避免字符串在循环中不断被更改,这会导致不断浪费空间。

String str="";
for(int x  =0;x<1000;x++){
	str+=x;//循环修改对象引用
}//最垃圾的代码.一定要避免,后面有StringBuffer(单线程)\StringBuilder(多线程)解决这个问题

String类的常用方法

java项目中大多数数据交互都是通过String进行交互的,记得查阅文档

toCharArray()拆分成字符数组

字节与字符串

转换方法:

使用构造方法可以把字符数组Byte[]转换成String

getBytes[]从字符串换成字符数组

一般只有在JavaWeb中用字符数组网络传输数据用

字符串比较

equals()

equalsIgnoreCase()

compareTo()

字符串查找

Indexof()一系列

lastIndexof()

startsWith()//购物车代码中经常见到

endsWith()

字符串替换

replaceAll()
replaceFirst()

字符串截取

subString()

字符串拆分

split()//如果设置是一个空字符串,则将整个字符串换成字符数组
//拆分的参数是正则表达式,符号记得转义

其他操作

concat()//链接
toLowerCase()//小写
tiUpperCase()//大写
trim()//去空格,也可以通过replaceAll()去空格
length()//取得长度
intern()//数据入池
isEmpty()//判断是否为空

this关键字

this关键字完成三项事情:

调用本类属性

方法参数名称与属性名称重复,此时使用this.属性明确指明要调用的是类中的属性而不是方法的参数

在访问本类中的属性时一定要加上this,不管是否重名,这样可读性更高

调用本类方法

this的本质就是明确进行本类结构的标记,除了访问类中的属性,也可以进行类中方法的调用

调用普通方法用this.方法()

调用构造方法直接this()就好

在一个类中虽然可以直接用方法名调用,但是推荐使用this调用本类的属性或者方法

使用this()方法可以消除构造方法中的重复代码,


使用this()的限制:

this()只能放在构造方法的首行

构造方法相互调用时,一定要保留调用的出口,不能各个构造方法里循环调用this

一般来说可以完善参数最多的构造方法,其他重载构造方法调用this(),减少代码重复


表示当前对象

最重要的属性:表示当前对象,当前对象就是当前正在调用的实例化对象

每个对象都有独立编码,在类内调用this专属于其类

this.属性也就是当前堆中保存的内容

引用传递

引用传递的核心思想是同一块堆内存空间被不同的栈内存所指向,类比于指针,于是不同的栈内存空间可以完成对一块堆地址的内容修改.

但是java的引用传递要比指针简单的多得多得多

参数的引用传递,所有的对象都是引用类型,所以使用参数引用其实就是栈内存对堆内存的引用,根本目的是完成对堆内存中数据的修改.

1.在函数调用引用类型的参数时

实质上是不同的栈内存在指向了同一块堆内存

直接对引用的堆空间进行修改,就会改变所有引用到该堆空间的所有引用类型

2.(String)引用传递中

使用函数其参数接收一个对象(该对象指向一个堆空间)

本质上是函数的参数变量(另一个独立的栈空间)对之前接收的对象的堆空间的引用

如果在函数内部改变了参数变量的引用目标,不会对接收的对象的引用进行任何更改.

而后,函数产生的垃圾空间被GC回收不对调用对象产生任何影响

在程序的表现中和基本类型的值传递用法差不多,

在非成员变量中进行的任何操作都不会对调用对象产生任何影响.

3.唯一改变对象直接引用的方法只有调用其所属类的成员函数

如果改变成员变量是String类型

在类的实例化成对象时,其实存在嵌套引用

即应用类型的成员也是引用类型

在使用成员函数进行修改时, 修改string其实时给string开辟了新的堆, 建立了新的引用

但是当前对象引用的String的栈空间还是原来的栈空间,最终使用效果和值传递一样

引用传递的实际应用

类的设计和数据表的设计一般无二

在类中,类的属性也可以包括实例化的本类对象.

于是就形成了链表

数据表与简单Java类的映射

简单java类在实际开发中都是根据其数据表定义来实现的

以下讲解深入的转换操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值