OOP
Oriented object program 面向对象编程
OOA
Oriented object analyze 面向对象分析
OOD
Oriented object design 面向对象设计
一切都是对象
C:面向过程 全是函数(功能体的封装)
面向过程与面向对象的比较
以满汉全席为例
面向过程:
强调的是功能行为
108道菜每一道工序全部捋一遍
面向对象:
将功能封装进对象,强调具备了功能的对象
分别找不同的厨师做不同的菜
entity:实体 new
面向对象的开发 设计 特征
开发的过程:不断创建对象,使用对象,指挥对象做事
设计的过程:管理和维护对象间的关系
面向对象的特征:
- 封装(encapsulation)
- 集成(inheritance)
多态(polymorphism)
类
物以类聚
对现实实物软件抽象。
对象 类的实例
**用属性和行为描述事物**
java中用类class描述事物也是如此
- 属性:对应类中的成员变量
行为:对应类中的成员函数
定义类其实在定义类中的成员变量和成员函数
类成员
成员变量
数值类型的成员变量的默认值是0
属性
成员函数
方法
定义方法
class 类名{} //首字母大写,
局部变量
定义在方法或者语句中
没有默认的初始化值,必须初始化
存在栈中
所在范围结束后,空间自动释放
堆栈
数组和对象在堆中
方法在栈中
class ClassDemo{
public static void main(String[] args){
//调用Person类
Person p = new Person();
p.run();
}
}
/**
*定义类
*/
class Person{
//成员变量----属性(property)====字段(field)
int height;
int weight;
int age;
//成员方法
public void run(){
System.out.println("run");
}
}
堆栈溢出
堆 默认是四分之一物理内存
栈空间是1M
java -X
java -Xmx100m //设置jvm堆空间的最大值
java -Xms100m //设置jvm的堆空间初始值
class StackHeap{
public static void main(String[] args){
//堆溢出 java -Xmx100M
byte[] arr0 = new byte[Integer.MAX_VALUE];
out(1);
}
//栈溢出
public static void out(int i){
System.out.println(i);
out(i + 1);
}
}
封装
将部分成员隐藏起来,外界只能通过其他方式进行方法
使用private进行修饰,保证安全
public
private
public class Cat {
private String color;
private int age;
public Cat(){
}
public String getColor(){
return color;
}
public void setColor(String c){
color = c;
}
}
class ClassDemo2 {
public static void main(String[] arge){
Cat c = new Cat();
c.setColor("yello");
System.out.print(c.getColor());
}
}
优化
构造函数
public class Cat {
private String color;
private int age;
//与类同名,为构造函数
public Cat(){
}
//用构造函数创建对象,可以直接赋值
public Cat(String c){
color = c;
}
public String getColor(){
return color;
}
public void setColor(String c){
color = c;
}
}
class ClassDemo2 {
public static void main(String[] arge){
Cat c = new Cat();
Cat c2 = new Cat("white");
c.setColor("yello");
System.out.print(c.getColor());
System.out.println("====================");
System.out.print(c2.getColor());
}
}
构造函数
- 函数名和类名相同
- 没有返回值 创建之后肯定返回该对象
- 可以重载
- 若类没有定义构造函数 jvm分配一个空构造
- 创建对象 new Xx();
- -
构造代码块
创建对象时调用
构造函数之前调用,先运行构造代码块(从头到尾),再运行构造函数(从头到尾)
/*
*定义Dog类
*
*/
class Dog{
//构造代码块
{
System.out.println("1.构造代码块");
}
对象创建过程
1 构造代码块
2 构造函数
类成员
- 成员变量
- 成员函数
- 构造代码块
- 静态代码块
- -
this
**指向对象自身的引用,this代本类对象的引用**
当函数内需要调用到该函数的对象时,就用this
public void setColor(String color){
this.color = color;
}
static
用于修饰成员(成员变量与成员函数)
被修饰的函数的特点:
- 随着类的加载而加载
- 优先于对象存在
- 被所有对象所共享
- 可以直接被类名调用
注意事项
- 静态方法只能访问静态成员
- 静态方法中不能写this super关键字
- 主函数是静态的
int tires;
static String BRAND = "BMW"
//静态方法只能访问静态成员
public static void outBrand(){
//若访问非静态成员则会出错
System.out.println(tires);
//只能访问static修饰的静态成员
System.out.println(BRAND);
}