Java复习笔记(一):面向对象
0、怎么理解“万事万物皆对象”
1、在Java语言的范畴内,我们将功能封装到类中,通过类的实例化,来调用具体的功能。
2、Java与前端交互时,将HTML中的标签转换为对象
3、Java与后端交互时,将数据库中的表转换为对象
0、前言:
-
学习Java面向对象的三条主线
1、类和类的成员
1.0、类和对象
修饰符 class 类名{
属性声明;
方法声明;
}
- 说明:
- 类的修饰符只有两种:public、缺省
- 类名:首字母大写
-
类的使用
-
对象的使用
-
匿名对象
1.1、属性
-
权限修饰符:private、缺省、protected、public
权限修饰符 访问权限 public 同一工程 protected 不同包的子类 缺省 同一个包 private 类内部 -
其他修饰符:static、final
-
变量的分类
成员变量(成员指的是类的成员) | 局部变量(局部指的所在的位置比类中还小一级) | |
---|---|---|
声明的位置 | 类内,方法体外 | 方法的形参、方法的内部、代码块内、构造器内 |
修饰符 | 四种权限修饰符+static、final | 不使用权限修饰符,可以用final |
初始化值 | 有默认的初始化值 | 没有默认的初始化值,必须显式的赋值 形参在调用时再赋值 |
内存加载位置 | 堆空间 或 静态域 | 栈空间 |
- 成员变量又分为
- 实例变量:不用static修饰,随着对象的创建而加载,每个对象有自己的一套。
- 类变量:static修饰,是随着类的加载二加载,多用对象共用一套。
- 属性的默认初始化值
成员变量类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或'\u0000'(表现为空) |
boolean | false |
引用类型 | null |
- 属性初始化的顺序
1.2、方法
1、说明
2、语法
权限修饰符 [static、final] 返回值类型 方法名(形参列表){
方法体;
return 返回值;
}
3、类的分类
- 公共类 外 测试类 、main
- 公共类 里
4、方法的重载
- 概念:同一类中,存在一个以上的同名的方法,但是他们的参数类型和参数个数不同
5、可变个数的形参
- 概念:允许直接定义能和多个实参相匹配的形参
- 格式:方法名(参数类型名...参数名)
- 实质:相当于数组,使用方法和数组下标一样,也因此形参中String[] books和String...books是不能共存的
- 应用场景:
- 数据库中,where后面不确定有多少个筛选条件
6、方法参数的值传递机制★★★★★
-
概念
-
Java实参怎么传递给形参呢?---只有一种,就是值传递机制(就是把实际参数的副本传递给方法,参数本身不受影响)
- 形参是基本数据类型:把实参的“数据值”传递给形参
- 形参是引用数据类型:把实参的“地址值”传递给形参
-
画内存解析图解题★★★★★
-
例题一:基本数据类型的参数传递
public class eg1 { public static void main(String[] args) { int x = 5; System.out.println("修改前x= " + x); change(x); System.out.println("修改后x= " + x); } public static void change(int x) { System.out.println("change修改前x= " + x); x = 3; System.out.println("change修改后x= " + x); } } /* 修改前x= 5 change修改前x= 5 change修改后x= 3 修改后x= 5 说明:change方法只是得到了x的值5,而不是得到了x */
-
例题二:引用数据类型的参数传递
public class eg2 { public static void main(String[] args) { Person p = new Person(); p.age = 5; System.out.println("修改前age= " + p.age); change(p); System.out.println("修改后age= " + p.age); } public static void change(Person p) { System.out.println("change修改前age= " + p.age); p.age = 3; System.out.println("change修改后age= " + p.age); } } class Person{ int age; } /* 修改前age= 5 change修改前age= 5 change修改后age= 3 修改后age= 3 说明:change方法得到了p的地址值,也指向了heap中的p,因此实际修改了age 结论:要想修改、交换,就要传递引用类型变量 */
-
7、方法的递归
- 递归,构成了隐式的循环
- 使用场景和例题
- 计算1到100自然数的和
- 求n!
- 台阶问题
- 汉诺塔
- 快排
1.3、构造器
-
作用
- 创建对象(无参)
- 创建对象并初始化(带参)
-
语法
权限修饰符 类名(参数列表){ } //权限和类保持一致
-
注意
1.4、代码块
-
作用:对类或对象进行初始化
-
分类:
-
使用:开发中的使用一般是为了初始化,但是用的较少。源码中出现要看懂
1.5、内部类
1.6、属性赋值的顺序
①默认初始化
③构造器初始化
- 后执行的会覆盖先执行的操作
1.7、JavaBean
1.8、UML类图
2、面向对象三大特征
2.1、封装
-
封装的引入
- 使用者如果可以直接操作类内部定义的属性,会导致:数据错误混乱、安全性问题--->把属性声明为private,再体统public的get、set方法实现对属性的操作。
- 当然,private还可以用在方法(仅在类的内部使用这个方法)和构造器(单例模式)中。
2.2、继承
1、继承的引入
- 多个类中具有相同的属性和行为,把这些内容抽取到单独的一个类中,其他的类只需要继承这个类,就能得到这些属性和行为。
- 语法:
class Subclass extends Supclass{}
- java只支持单继承
2、重写(override/overwrite)
2.3、多态
1、多态性的体现
2、多态的应用
3、虚拟方法调用★★★★★
- 含义:子类重写了父类的方法,多态情况下,父类的方法就叫
虚拟方法
。父类根据赋给他的 不同子类的对象,动态的调用属于子类的该方法。这样的方法调用在编译器是无法确定的,因此称为动态绑定
- 用法
- 应用示例:连接数据库时
4、instanceof
-
引入:有了多态以后,内存中有了子类的属性和方法,但是我们声明的父类类型,因此调用不了子类特有的属性和方法。怎么调用子类特有的属性方法呢---->强制类型转换为子类类型再调用,这时就要判断是不是这种类型,再进行转换。
-
自动类型提升(从子类到父类,自动进行)和强制类型转换(从父类到子类,instanceof判断再进行)
-
区分
-
怎么证明多态是运行时行为★★★★★
class Animal { protected void eat() { System.out.println("animal eat food"); } } class Cat extends Animal { protected void eat() { System.out.println("cat eat fish"); } } class Dog extends Animal { public void eat() { System.out.println("Dog eat bone"); } } class Sheep extends Animal { public void eat() { System.out.println("Sheep eat grass"); } } public class InterviewTest { public static Animal getInstance(int key) { switch (key) { case 0: return new Cat (); case 1: return new Dog (); default: return new Sheep (); } } public static void main(String[] args) { int key = new Random().nextInt(3); System.out.println(key); Animal animal = getInstance(key); animal.eat(); } }
-
多态笔试题
public class InterviewTest1 { public static void main(String[] args) { Base1 base = new Sub1(); base.add(1,2,3); Sub1 s = (Sub1)base; s.add(1,3); } } class Base1 { public void add(int a,int... arr) { System.out.println("base1"); } } class Sub1 extends Base1 { public void add(int a,int[] arr) {//从实质上看,算是重写,编译器也这么认为 System.out.println("sub_1"); } public void add(int a,int b,int c) {//优先使用确定参数的方法 System.out.println("sub_2"); } }
5、例题
3、其他关键字
3.1、this
3.2、super
3.3、package
-
格式:
package 顶级报名.子包名;
,分别对应目录的层次 -
位置:第一行
-
了解一下JDK中主要的包
包 说明 java.lang 包含一些java的核心类:String、Math、Integer、System、Thread,提供常用功能 java.net 包含执行和网络相关的操作的类和接口 java.io 包含能够提供多种输入输出功能的类 java.util 实用工具类 java.text java格式相关的类 java.sql java进行JDBC数据库编程的相关类和接口 java.awt 构成抽象窗口工具集(abstract 、window、toolkits)的多个类,用来构建和管理GUI
3.4、import
-
引入:在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类
-
使用说明
3.5、static
-
static的引入
-
static修饰属性
-
static修饰方法
-
应用场景
-
static属性
-
static类
-
单例模式(面试题):某个类只存在一个对象实例
-
饿汉式
class Singleton(){ //1.外部不能创建---私有化类的构造器 private Singleton(){} //2.内部帮你创建---内部提供当前类的实例 private static Singleton single = new Singleton(); //3.给外部提供得到的方法---提供公共的静态方法,返回当前类的对象 public static Singleton getInstance(){ return single;//4.这里用到了single,所以必须是静态的,回去改正 } }
-
懒汉式
class Singleton(){ //1.外部不能创建---私有化类的构造器 private Singleton(){} //2.内部帮你创建---内部提供当前类的实例 private static Singleton single; //3.给外部提供得到的方法---提供公共的静态方法,返回当前类的对象 public static Singleton getInstance(){//4.这里用到了single,所以必须是静态的,回去改正 if(single == null){ single = new Singleton; } return single; } }
-
两者对比
饿汉式 懒汉式 好处 线程安全 延迟创建对象 坏处 对象加载的时间过长 目前的写法线程不安全(多线程时修改) -
使用场景
- 网站计数器、数据库连接池、任务管理器、回收站
-
-
3.6、final
- final类
- 不能被继承(绝后。。。)
- 举例:String类、System类、StringBuffer类
- 为什么要声明为final:因为系统把该有的功能都提供了,不用我们自己搞新花样啦!
- final方法
- final
- static final一起使用
3.7、abstract★★★★★
-
引入:随着继承层析的增加,子类越来越具体,父类越来越一般、通用、抽象。有时一个父类特别抽象,以至于没有具体的实例,这样的类就叫抽象类。抽象类就像作文模板,我们只需要在可变的部分修修补补就好了。
-
abstract修饰类
-
abstract修饰方法
-
应用场景举例
- 计算计划人图形的面积(因为不知道是具体什么图形,计算方法就不一样)
-
注意
-
抽象类的匿名子类(只用一次,图省事)(见到要认识)
//Person类是抽象的 //创建匿名子类的对象 Person p = new Person(){//并不是new的Person的对象,而是子类的对象 @Override public void eat(){ } } //创建匿名子类的匿名对象 method(new Person(){ @Override public void eat(){ } })
3.8、interface★★★★★
-
接口的本质:标准、规范。接口是
抽象方法
和全局常量
的集合 -
接口的特点
-
接口和抽象类的对比(面试题)