面向对象编程 oop
面向对象的本质就是:以类的的方式组织代码,以对象的组织(封装)数据
三大特性:
- 封装
- 继承
- 多态
方法的定义
格式:
修饰符 返回值类型 方法名 (参数类型 参数名 ){
······;
方法体;
······;
return 返回值;
}
break和return区别:
break:跳出switch,结束循环
return:结束方法,返回一个结果
方法的调用
静态方法:关键字 static
调用方法时可以直接调用
和类一起加载
非静态方法:
即没有用static修饰,调用时必须把类实例化,即使用new出来
public static void main(String[] args) {
//静态方法 ststic
Demo02.eat();
//非静态方法
Demo02 demo02=new Demo02();
demo02.say();
}
public void say(){
}
public static void eat(){
}
类与对象的关系
类是一种抽象的数据类型,它是对某一类事物整体的描述,但是并不代表具体事物
对象是抽象概念的具体实例
创建与初始化对象
使用new关键字创建对象,会进行默认的初始化以及对类中的构造进行调用。
构造方法:
- 必须和类的名字相同。
- 必须没有返回值类型,也不能写void。
构造方法作用:
- 实例化初始值。
- 使用new关键字,本质是在调用构造器。
注意:一旦定义了有参构造,无参就必须显示(写入代码中)。
对象的引用
引用类型:除基本类型(8个)外其他都可称为引用类型
对象是通过引用来操作的,
属性
字段 Field 成员变量
默认初始化:
- 数字:0
- char:u0000
- boolean:false
- 引用:null
赋值万能公式(实例化):
修饰符 属性类型 属性名 = 属性值;
对象的创建和使用
- 必须使用 new 关键字来创建对象,必须有构造器(默认会有一个无参的)
- 对象的属性
- 对象的方法
Person person = new Person(); //实例化一个对象
person.name; //调用对象的属性
person.sleep(); //调用对象的方法
类
- 静态的属性(属性)
- 动态的行为 (方法)
三大特性
封装
private(私有),一般情况是把属性包装到一个类中。(数据隐藏)
尽量高内聚,低耦合
意义:
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 提高系统的可维护性
继承
本质是对某一批类的抽象,从而实现对现实世界更好的建模。
关键字 extends,java中只有单继承,没有多继承。
子类继承了父类,就会拥有父类的所有public类型的方法和属性,
在Java中所有类都默认直接或间接继承object类
super:
- super调用父类的构造方法,必须早构造方法的第一个
- super 必须只能出现在子类的方法或者够着方法中
- super 和 this 不能同时调用构造方法
super与this的比较:
-
代表的对象不同:
this :本身调用者这个对象
super:代表父类对象的应用
-
前提
this没有继承也可以使用
super只能在继承条件才可以使用
-
构造方法
this()调用的本类的构造
super()调用的父类的构造
方法的重写:
需要有继承关系,子类重写父类的方法。
1. 方法名必须相同
1. 参数列表必须相同
1. 修饰符:范围可以扩大 public > protected > default > private
1. 抛出的异常:范围:可以被缩小,不能被扩大
当子类不需要父类的功能或者不满足子类所需要的功能时就可以重写
注意:通过static、final修饰的方法不能被重写,私有的(private)方法也不能被重写
多态
动态编译即提高可扩展性
注意:
- 多态是方法的多态,属性没有多态
- 父类和子类有联系
- 存在的条件:
- 要有继承关系
- 方法需要重写
- 父类的引用指向子类对象 Person p1 = new Student();
instanceof 和类型转换:
System.out.println(x instanceof y);
判断是否能够对象转化,提高向下转型的安全性
类型转换:
- 父类引用指向子类的对象(前提)
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转换(容易丢失父类的一下方法)
- 方便方法的调用,减少重复的代码
static
可以修饰方法以及变量,使其变成静态的。
private static int age;//静态变量 多线程
private double score;//非静态变量
public void run(){
}
public static void go(){
}
非静态变量以及方法不能直接被调用,必须实例化对象后调用
此外还有静态代码块。
{
//匿名代码块
}
static {
//静态代码块
}
//执行顺序,静态代码块(只执行一次),匿名代码块,构造方法,
在实例化对象时,都会被调用,优先待用静态代码块,其次匿名代码块,最后才是构造方法,静态代码块只会执行,匿名代码块以及构造方法调用几次执行几次
静态导入包。(不建议使用)
import static java.lang.Math.random;//静态导入包
public class Test {
public static void main(String[] args) {
System.out.println(random());//可以直接使用
}
}
当没有使用静态导入包是,使用random()时的格式为Match.random()
抽象类
修饰符:abstract。单继承
- 不能被new抽象类,只能靠子类去实现它
- 抽象类的所有的方法,继承它的子类必须实现它的方法
- 抽象类里可以写普通方法,抽象方法必须在抽象类中
接口
只有规范,自己无法写方法。
关键字:interface。可以多继承。
作用:
- 是一个约束
- 定义一些方法,让不同的人实现
- 方法都是 public abstyact ,常量都是 public static final
- 接口不能被实例化,接口中没有构造方法
- 可以通过 implements 实现接口
- 实现接口必须重写接口中的方法