面向对象概述
- 什么是面向对象?
简写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”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串