JAVA学习笔记:面向对象(OOP)

面向对象概述

  • 什么是面向对象?

简写OOP,既Object Oriented Programming,面向对象编程。注意其与面向过程的区别。

面向过程:是具体化的,流程化的,解决一个问题,需要一步一步的分析,一步一步的实现。
例如想吃鱼香肉丝,去买食材、调料,再进行烹饪、装盘。
优点:性能比面向对象好、因为调用时需要实例化、开销大、消耗资源大。
缺点:不易维护、不宜复用、不宜扩展。

面向对象:是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,无需了解。
例如想吃鱼香肉丝,去饭店下单鱼香肉丝。
优点:易维护、易扩展、易复用。
缺点:性能比面向过程差。

类和对象

对象:是具体的事物,是类的一个实例,具有状态与行为。例如,一条狗为一个对象,它的状态有:颜色、名字;行为有:叫、跳。

类:具有相同属性、特征、功能行为方式的一类事物的信息描述,描述一类对象的行为与状态。例如,男孩、女孩,具体的每个人为该类的对象。

程序中的类与对象

程序–解决问题:算法+数据结构,其本身是一种文件,不运行时不能解决问题,运行时会调度计算机资源来解决问题。
代码是计算机指令,不存在对象

  • 程序中有对象吗?
  • 程序中对象在哪里?
int [] arr = new int[10000];//arr是一个数组对象的对象名

//分为前后两个部分
new int[10000];//向系统申请了可以存10000个整数的空间
int [] arr =//将这10000个整数空间赋值给arr

//具体的对象:是new代码执行后的结果

类的结构

关键字:class

public class 类名{
//一类事物的相同、相似的属性、特征、功能行为方式
	//名词:属性
	//格式:属性的数据类型 属性名称
	String name;
	//常量 变量
	final int id =20;
	//final 最终形态,不可变,可以修饰成员属性、方法、类
	//动词:行为的描述,方法
	//格式:返回值类型 方法名(参数类型 参数名称){
	//}
	void login(String username,String pwd){
		System.out.println("登录流程")
	}
	//功能类型代码
	//1、构造方法 用于一个类创建不同初始属性对象
	//格式:类名(){
	//}
	//2、代码块 用于对象创建的时候 初始化数据
	//每次创建对象的时候 初始化 数据
	static int num;
	static void test(){
	}
	//static 静态的、唯一的、修饰,不属于对象,直接属于类,由类直接调用且只有一份
	//格式:修饰属性 方法 代码块
}

创建对象

格式:类名 对象名 = new 类名 ();
new 类名(); 向系统申请一块满足类中属性声明需求的空间
类名 对象名 = 将这一对象空间地址赋值给对象名
对象名:对象空间引用地址存储变量
对象:代码执行后的结果,是数据化的事物,存储在内存中

String str1 = new String("ABC");
String str2 = str1;
//如果改变str2的值会改变str1吗?
//会改变,因为改变str2的值就是改变被赋值的空间地址的值,所以str1也会跟着改变
public class test0623 {
	public static void main(String[] args) {
		String str1 = new String("ABC");
		// new 创建字符串 如果常量池中没有 就会创建一个字符串常量 
		// 还会继续在堆中创建一个 将堆中的地址返回 
		
		String str2 = str1.intern();// 取到常量池中这个地址 
		String str3 = new String("ABC");
		String str4 = str3.intern();// 取到常量池中这个地址 
		
		System.out.println("str1="+str1);
		//str1=ABC
		System.out.println(str2==str1);
		//false 因为str1指向的是在堆上创建的字符串对象地址,没有添加到常量池之中,str2是指向常量池中的地址。
		System.out.println(str3==str1);
		//false str1与str3所引用的堆中对象的地址不同
		System.out.println(str2==str3);
		//false 因为str3指向的是在堆上创建的字符串对象地址,没有添加到常量池之中,str2是指向常量池中的地址。
		System.out.println(str4==str2);
		//true str4与str2都指向常量池中相同地址

}
}

new String都是在堆上创建字符串对象。当调用intern()方法时,编译器会将字符串添加到常量池之中,并返回该常量的引用
在这里插入图片描述
在这里插入图片描述
通过字面量赋值创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工藤赵一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值