我的JAVA笔记
----------------------------------第一章JAVA面向对象(上)
----------------------------------2019.1.14
1.面对对象概念
1.1面向对象和面向过程
-
面向过程:基于步骤的解决方法。
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源(单片机、嵌入式开发一般采用面向过程,性能比较重要)
缺点:不易维护,复用,扩展 -
面向对象:分解成不同的对象,建立对象以描述行为。一组对象互相配合通过沟通完成特定的功能。
优点:易维护,复用,扩展
缺点:性能较面向过程低
1.2面向对象的相关概念
- 类型(类),指一个名词概念,比如:客人,菜品
- 引用(变量),指引用具体概念实例的代词,比如某人,某道菜
- 对象(东西),指的是具体概念的个体实例,比如一盘大盘鸡
- 行为,方法
- 多态,行为或引用在具体情形下发生变化
- 封装
- 继承
2.面向对象的主要特征
(1)封装(将一个类的成员变量私有化。)
目标:实现软件部件的“高内聚,低耦合”
(2)继承(Java的继承是单继承,每个子类最多只有一个直接父类。)
目标:提高软件的可重用性和可扩展性
(3)多态(多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。)
- Java 引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。
- 如果编译时类型和运行时的类型不一致,这就有可能出现所谓的多态。两个相同类型的引用变量,由于它们实际引用的对象的类型不同,当它们调用同名方式时,可能呈现出多种行为特征,这就是多态。
目标:增强软件的灵活性和扩展性
(4)抽象
3.类和对象
- 一个类里可以包含三种最常见的成员:构造器、属性、方法。
- new关键字:通过关键字new 加上对应的构造器,创建对象。
- static关键字:”静态”。所有有static 修饰的叫类属性,类方法,类成员。(可以直接通过类名调用该属性和方法,非static就需要通过该类的实例对象调用)
- this 关键字:总是指向调用该方法的对象。(this局部变量)
注意:this不能出现在static修饰的方法中 - 对象的默认值:null
4.Java变量(局部变量、实例变量、静态变量)
-
成员变量指的是在类范围里定义的变量。
-
局部变量指的是在一个方法内定义的变量。局部变量可分为三种:形参、方法局部变量、代码块局部变量。
-
根据有无static 修饰可分为实例变量和静态变量。
(1) 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
(2)静态变量属于类,(类变量),只要程序加载了类的字节码,静态变量就会被分配空间,就可以直接通过类名调用了。
(3)实例对象取决于类的实例,每创建一个实例,jvm为实例变量分配一块内存,位于堆区(heap)中,生命周期取决于实例的生命周期。
(4)类的静态变量在内存中只有一个,Java虚拟机为静态变量分配内存,静态变量位于方法区,被类的所有实例共享,生命周期取决于类的生命周期。
5.访问控制权限
- private 私有的。在同一个类里能被访问
- default 默认的。本包访问权限
- protected 受保护的。子类中也能访问
- public 公共的。在任何地方都可以访问
6.对象
6.1创建对象
- 构造器的作用:用来描述对象的创建过程。
- Java中的构造器:
(1)Java类一定有构造器(默认)
(2)使用关键字new时,jvm调用构造方法创建对象
(3)无声明时,javac提供一个无参默认构造器,如果有声明,javac便不再提供
(4)可重载,多个参数不同的构造器,为了实现构造方法的重用
6.2对象实例化过程
step1:在创建类之前,检查类是否加载(将硬盘上的.class文件加载到内存中),如果没有就加载这个类,在加载这个类之前要加载所有父类。
Java运行时加载的策略:懒惰式加载(按需加载),如果第一次用到就加载,只加载一次。通过CLASSPATH指定的路径寻找.class文件,加载以后是一个对象,类型是Class。
step2:在内存堆中分配对象空间,递归分配所有父类和子类属性空间。
属性默认自动初始化,自动初始化为“0”值。
step3:进行属性的赋值。
step4:递归调用父类构造器。(默认无参)
step5:调用本类构造器。
6.3Java内存管理与分配
(1)栈stack:LIFO(后进先出)
(2)堆heap:随机分配
6.4对象方法
6.4.1方法签名
(1)方法签名=方法名+参数类型列表
注意:方法签名不包括返回类型和访问修饰符
(2)Java中不能存在相同方法签名的方法
6.4.2方法参数
(1)Java方法参数的传递:值传递,变量值的复制。
(2)基本类型就是值的复制
(3)引用类型是引用值(地址)的复制
6.4.3重载和重写
编译时多态:重载(overload)
运行时多态:重写(override)
-
重载:方法名相同,方法参数列表不同
(1)不能通过访问权限、返回类型、抛出的异常进行重载
jvm无法判断到底调用哪一个
(2)异常类型和数目不造成影响
(3)jvm对方法参数实行自动向上转型,当有多个满足方法参数列表时,jvm以“就近原则”调用 -
重写:子类重写父类中的方法,方法签名一致
(1)不能重写父类private方法
子类无法访问父类的private方法,无法重写该方法。若方法签名、返回值相同,只是子类定义了一个新方法。
(2)抛出的异常必须与被重写的方法所抛出的异常一致或是其子类。