0.2java基础(中)

面向对象基础

面向对象与面向过程

两者的主要区别在于解决问题的方式不同:

  1. 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。 面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
  2. 另外,面向对象开发的程序一般更易维护、易复用、易扩展。
成员变量与局部变量

语法:public private static(属于类故用来修饰成员变量,不可修饰局部变量)final都可修饰
存储位置:堆、栈
生命周期(生存时间)
默认值:成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

对象实体与对象引用

一个对象引用可以指向 0 个或 1 个对象,一个对象可以有 n 个引用指向它。

构造方法

如果一个类没有声明构造方法,该程序能正确执行吗?
如果一个类没有声明构造方法,也可以执行!因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),Java 就不会再添加默认的无参数的构造方法了,这时候,就不能直接 new 一个对象而不传递参数了,所以我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为要调用无参的构造方法)。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。

构造方法不能被 override(重写),但是可以 overload(重载)

面向对象特征

通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
多态,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例
多态的特点

  1. 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
  2. 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
  3. 多态不能调用“只在子类存在但在父类不存在”的方法;
  4. 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
接口和抽象类

共同点 :

  1. 都不能被实例化。
  2. 都可以包含抽象方法。
  3. 都可以有默认实现的方法(Java 8 可以用 default 关键在接口中定义默认方法)。

区别 :

  1. 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。
  2. 抽象类主要用于代码复用,强调的是所属关系。
  3. 一个类只能继承一个类,但是可以实现多个接口
  4. 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
深拷贝、浅拷贝,引用拷贝

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。(会新建对象,但是对象内部引用类型属性会直接复制引用地址)

深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

引用拷贝:不同引用指向同一个对象。

String

(如果HashSet中元素为StringBuilder,即可变性,若使用引用拷贝,修改元素值,可能会破坏HashSet键值的唯一性)→不要用可变类型做HashMap和HashSet的键值。

String是不可变关键是因为SUN公司工程师在后面所有String方法里很小心的没有去动Array里的元素,没有暴露内部成员字段。且String类为final禁止继承,避免被其他人继承后破坏,故String不可变的关键都在低层实现,而不是一个final

在 Java 9 之后,String 、StringBuilder 与 StringBuffer 的实现改用 byte 数组存储字符串。

StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的元素符

对象引用和“+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象

在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象。

字符串常量池

JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

JDK1.7 之前运行时常量池逻辑包含字符串常量池存放在方法区。JDK1.7 的时候,字符串常量池被从方法区拿到了堆中。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值