面向对象
面向对象(抽象)
面向对象的本质是:以类的方式组织代码,以对象的组织(封装)数据
对象的创建分析
类
类的声明
属性和局部变量:
-
相同点:
- 定义变量的格式,数据类型 变量名 = 变量值
- 先声明,后使用
- 变量都有其对应的作用域
-
不同点:
-
在类中声明的位置不同
- 属性:直接定义在类的一对{}内
- 局部变量:声明方法内,方法形参,代码块内,构造器形参构造器内部的变量
-
关于权限修饰符的不同
-
属性:可以在声明属性时指明其权限,使用权限修饰符
常用的权限修饰符:private,public,缺省,protected -->继承
-
局部变量:不可以使用权限修饰符
-
-
默认初始化值
-
属性:类的属性,根据其类型,都有默认初始化值,
整型(byte,short,int,long):0
浮点型(float,double):0.0
字符型(char):0(或‘\u000‘)
布尔型(boolean):false
引用数据类型(类,数组,接口):null
-
局部变量:没有默认的初始化值
意味着,我们在调用局部变量之前,一定要显示赋值
特别的,形参在调用时,我们赋值即可
-
-
在内存中加载的位置
- 属性:加载到堆空间中(非static)
- 局部变量:加载到栈空间
-
类和对象的关系
类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是不能代表某一个具体事物
对象是抽象概念的具体实例
类是对象的模板
创建初始化对象
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
匿名对象:
- 没有显示的赋给一个变量名,即为匿名对象
- 特征:匿名对象只能调用一次
- 使用
构造器
-
类中的构造器也称为构造方法,是在进行创建对象时必须调用的,其特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
- 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
-
作用:
-
使用new关键字本质是在调用构造器
有参构造:一旦定义了有参构造,无参构造就必须显示定义
-
用来初始化值
-
-
注意:定义了有参构造之后,如果想要使用无参构造,显示的定义一个无参的构造
创建对象内存分析
Java内存
堆 唯一目的是存放对象实例
栈 是指虚拟机栈,虚拟机栈用于存储局部变量
方法区 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
JavaBean
一种Java语言写成的可重用组件
所谓JavaBean是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get,set方法
UML类图
+表示public类型,-表示private类型,#表示protected类型
方法的写法:方法的类型(+,-) 方法名(参数名:参数类型):返回值类型
面向对象的三大特性
封装
-
作用:
- 提高程序安全性,保护数据;
- 隐藏代码的实现细节;
- 统一接口;
- 增加系统可维护性;
-
属于私有
-
属性私有,private:私有
-
get/set
提供可以操作该属性的方法, 提供一些public的get,set方法 alt+insert可以自动生成方法
- get 获得这个数据
- set 给这个数据设置值
继承
本质是对某一批类的抽象,从而实现对现实世界更好的建模
extends的意思是扩展,子类是父类的扩展,子类继承了父类就会继承父类所有的方法
Java类中只有单继承,没有多继承
-
object类:Java中,所有的类都默认直接或间接继承object类
-
super —— this
super注意点:
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或构造方法中
- super和this不能同时调用构造方法
VS this:
- 代表的对象不同:
- this:本身调用者这个对象
- super:代表父类对象的应用
- 前提:
- this:没有继承也可以使用
- super:只能在继承条件下使用
- 构造方法:
- this:本类的构造
- super:父类的构造
-
方法重写 重写是方法的重写,与属性无关 overried 重写
子类的方法和父类必须要一致;方法体不同
静态方法:只与左边定义的数据类型有关
非静态方法:重写
需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但是不能缩小 public>Protected>Default>private
- 抛出的异常:范围可以被缩小但是不能扩大
ClassNotFoundException
–>Exception
(大)
Object类 java.lang.Object
Object类中的功能(属性,方法)具有通用性
Object类只声明了一个空参的构造器
多态
对象的多态性:父类的引用指向子类的对象
多态的使用,虚拟方法调用
方便方法的使用,可以减少重复的代码
注意事项:
-
多态是方法的多态,属性没有多态
-
父类和子类,有联系, 类型转换异常
ClassCastException
-
存在条件:继承关系,方法需要重写,父类引用指向子类
不能重写的方法:
- static方法属于类,不属于实例
- final方法
- private方法
instanceceof和类型转换
子类转换为父类,强制转换,可能丢失一些方法
static关键字
static静态代码块,随类一起执行,只执行一次
==和equal()的比较
-
== 运算符
-
可以引用基本数据类型和引用数据类型
-
比较基本数据类型,比较两个变量保存的数据是否相同
比较引用数据类型,比较两个对象的地址值是否相同,即两个对象是否指向同一个对象实体
-
-
equal 方法而非运算符
-
只能使用与引用数据类型
-
Object类中equal()的定义:
public boolean equal(Object obj){ return (this == obj); }
说明:Object类中定义的equal和==作用是相同的,比较两个对象的地址是否相同,即两个引用是否指向同一个对象实体
-
像String、Date、File、包装类等都重写了Object中的equal()方法,重写以后比较的不是两个地址是否相同,而是比较两个对象的“实体内容”是否相同
-
equal()重写
对称性,自反性,一致性,任何情况下,equal(null)返回false
-
代码块(或初始化块)
作用:用来初始化类,对象
只能用static修饰
静态代码块和非静态代码块:
-
静态代码块
内部可以有输出语句
随着类的加载而执行
初始化类的信息
如果一个类中定义了多个静态代码块,按照声明先后顺序执行
静态代码块的执行优先于非静态代码块
静态代码块内只能调用静态的属性,方法
-
非静态代码块
内部可以有输出语句
随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
创建对象时,对对象的属性初始化
非静态代码块年可以调用静态的属性,方法,非静态的属性,方法
//static的代码块
static{
System.out.println("hello,static clock");
}
//非static的代码块
{
System.out.println("hello block");
}
抽象类和接口
抽象类(抽象的抽象,约束)
在类前面使用abstract即可变成抽象类,类的本质还是继承,(接口可以实现多继承)
abstract用在方法上,为抽象方法,只有方法的名字,没有方法的实现
抽象类的所有方法继承了它的子类,都必须要实现它的方法,除非子类也是abstract
不能new出来,只能靠子类实现它
抽象方法必须在抽象类中
//是否存在构造器,存在的意义(抽象出来,提高开发效率)
接口
声明类的关键字是class,接口声明的关键字是intreface
,接口都需要实现类
package com.company;
public interface users {
//接口中定义的所有的属性默认的都是常量 public static final
int age = 10;
//接口中定义的所有的方法都是抽象的public interface
void add(String name);
void delate(String name);
void uodate(String name);
}
package com.company;
public interface time {
void timer(String time);
}
package com.company;
//类可以实现接口,implements 接口
//实现了接口的类,就需要重写接口的方法
public class usersImpl implements users,time{
@Override
public void add(String name) {
}
@Override
public void delate(String name) {
}
@Override
public void uodate(String name) {
}
@Override
public void timer(String time) {
}
}
作用:
- 约束
- 定义一些方法,让不同的人实现
public interface
public static final
- 接口不能被实例化,接口中没有构造方法
- 通过implements可以实现多个接口
- 必须要重写接口中的方法
创建接口匿名实现类的对象
应用:
- 代理模式
- 工厂模式
内部类及OOP实战
内部类就是在一个类的内部定义一个类
-
成员内部类(静态,非静态)
可以获得外部类的私有属性私有方法
一方面,作为外部类的成员,
- 调用外部类的结构
- 可以被static修饰
- 可以被四种不同的权限修饰
另一方面,作为一个类
- 可以定义属性,方法,构造器等
- 可以被final修饰,表示不能被继承;不使用final,可以被继承
- 可以被abstract修饰
class Person { String name; int age; public void eat (){ System.out.println("吃饭"); } //静态成员内部类 class Dog { String name; int age; public void show(){ System.out.println("kala is a dog!"); } } //非静态成员内部类 class Bird { String name; public Bird (){ } public void sing (){ System.out.println("i am a bird!"); Person.this.eat(); eat(); System.out.println(age); } public void display (String name){ System.out.println(name); System.out.println(this.name); System.out.println(Person.this.name); } } public void method() { //局部内部类 class AA { } } { //局部内部类 class BB{ } } public Person(){ //局部内部类 class CC{ } } }
-
静态内部类
一个Java类中可以有多个class类,但是只能有一个public class类
-
局部内部类(方法内,代码块内,构造器内)
class Text{ public void method(){ //局部内部类 class AA{ } } //返回一个实现了Comparable接口的类对象 public Comparable getComparable(){ //创建一个实现了Comparable接口的类:局部内部类 //方式一: class MyComparable implements Comparable{ @Override public int compareTo(Object o) { return 0; } } return new MyComparable(); //方式二: return new Comparable() { @Override public int compareTo(Object o) { return 0; } }; } }
-
匿名内部类
包装类
Java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特性
基本数据类型,包装类,String的转换
- 基本数据类型----------->包装类 调用包装类的构造器 自动装箱
- 包装类----------->基本数据类型 调用包装类Xxx的xxxValue() 自动拆箱
- 基本数据类型,包装类----------->String
- 方式一:连接运算
- 方式二:调用String重载的
valueOf(Xxx xxx)
- String----------->基本数据类型,包装类