面向对象
面向过程&面向对象
- 面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么…
- 面向过程适合处理一些较为简单的问题
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
- 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理
什么是面向对象
- 面向对象编程(Object- Oriented Programming,OOP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
- 抽象
- 三大特性:
- 封装
- 继承
- 多态
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
- 从代码运行角度考虑是先有类后有对象。类是对象的模板
回顾方法及加深
-
方法的定义
- 修饰符
- 返回类型
- break:跳出switch,结束循环和return的区别
- 方法名:注意规范就OK 见名知意
- 参数列表:(参数类型,参数名)…
- 异常抛出:
-
方法的调用:
- 静态方法
- 非静态方法
- 形参和实参
- 值传递和引用传递
- this关键字
-
注意点
- 非静态方法可以调用静态方法/属性和非静态方法/属性
- 静态方法可以调用静态方法/属性,但无法调用非静态方法/属性
-
值传递与引用传递
- 当方法的参数为基本类型时,采用的是值传递
- 引用传递:对象,本质还是值传递
- 数组也是一个对象,所以数组也是引用传递
-
this关键字
- this用于指代自身类中的变量或方法
-
String
-
public static void main(String[] args) { String c ="abc"; System.out.println(c); //输出为 abc f(c); System.out.println(c); //输出为 abc } public static void f(String c){ c = "ABC"; } /* 看到这里是不是感觉很奇怪,为什么String明明是引用类型的应该是 引用传递才对,这里为什么看起来像值传递?然而实际上string采用 的确实是引用传递,但对string的每一次修改相当于创建了一个新的 对象 */ //下面看一个简单的例子你就明白了 c="abc"; //假设此时c指向的地址为1000 //由于对c的内容进行修改相当于创建了一个新的对象 c="123"; //所以此时c指向的地址发生了改变
-
/* 当字符串数组作为参数时,如果是对字符串数组整体修改,那么结果 跟对字符串修改类似,整个字符串数组均未被修改 */ public static void main(String[] args) { String[] c = {"abc", "ABC"}; System.out.println(c[0]); //输出为 abc f(c); System.out.println(c[0]); //输出为 abc } public static void f(String[] c) { c = new String[]{"123", "456"}; }
-
/* 当字符串数组作为参数时,如果是对字符串数组局部修改(通过下 标修改),那么结果是单个字符串被修改 */ public static void main(String[] args) { String[] c = {"abc", "ABC"}; System.out.println(c[0]); //输出为 abc f(c); System.out.println(c[0]); //输出为 123 } public static void f(String[] c) { c[0] = "123"; }
-
Java基本数据类型传递参数时是值传递;引用类型传递参数时是引用传递。
-
值传递时,将实参的值传递一份给形参;引用传递时,将实参的地址值传递一份给形参。
-
值传递时,实参把它的值传递给对应的形参,函数接收的是原始值的一个拷贝,此时内存中存在两个相等的基本类型,即实参和形参,后面方法中的操作都是对形参这个值的修改,不影响实参的值。引用传递时,实参的引用(地址,而不是参数的值)被传递给方法中相对应的形参,函数接收的是原始值的内存地址;在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
-
需要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新创建一个对象,所以要特殊对待。因为最后的操作不会修改实参,可以认为是和基本数据类型相似,为值传递。
-
-
字符串常量池
类与对象的关系.
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
- 动物、植物、手机、电脑…
- Person类、Pet类、 Car类等, 这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
- 对象是抽象概念的具体实例
- 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念
创建与初始化对象
-
使用new关键字创建对象
-
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用,new本质在调用构造方法,初始化对象的值
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下几个特点:
-
必须和类的名字相同
-
必须没有返回类型,也不能写void
-
默认构造器为 public 类名(){}
-
构造器方法也可以重载,当出用户定义了一个构造器方法(无论此方法是否有参)时,默认构造器方法将不复存在
-
构造器虽然没有返回类型,但也可以使用return
-
必须和类的名字相同
-
必须没有返回类型,也不能写void
-
默认构造器为 public 类名(){}
-
构造器方法也可以重载,当出用户定义了一个构造器方法(无论此方法是否有参)时,默认构造器方法将不复存在
-
构造器虽然没有返回类型,但也可以使用return
-