Lei❤面向对象2

下面就提出一些面向对象中用到的关键字

1.static关键字

成员变量+static=静态变量

那我们为什么要加这个关键字呢,他有什么作用呢

 当我们在设计类的时候 发现多个对象中有共享数据的时候 我们就可以把这个共享的数据 定义为静态的
 name age虽然每个对象都有 但是值不一定一样,这个就和成员变量分开了,一个是特有数据,一个是公有

 所以我们说成员变量创建在堆内存中,那么加了static关键字后,就等于说是静态的东西从堆中对象空间抽取出来了,放在了静态方法区

成员函数+static=静态函数

当前成员函数如果不访问任何成员变量的情况下 这个函数就可以定义为静态的

这也就是说,静态函数不能直接调用当前类中的成员变量 无法从上下文引用非静态

这就是为什么主函数是静态的了

因为主函数是程序的入口,优于其他运行,假设主函数是非静态的,那么必须先创建对象才能调用主函数,那么创建对象时的代码执行怎么开始呢?这就是原因

下面谈一下类都有哪些

类分为实体类,工具类,主类/测试类

实体类:

就是为了描述一个事物 Person Point
类中内容基本上都是成员函数/成员变量
也会而存在一个静态成员

工具类:

 提供一些已经被实现好的功能 向外部供应
所以工具类中基本上全都是静态函数
类.Xxx 类.Xxx() Math Arrays
为啥工具类中都是静态?
1.共有的
2.长时间存在
3.加载一次 后期随便使用
如果工具类可以被创建对象 是不是就想用的时候去创建
 效率较低,所以就提供一些已经实现好的功能。

主类:

主要用于运行/测试代码
这个类中会有主函数的存在
实体类是可以存在主函数的 但是不推荐
工具类一般不会存在主函数

这里为了避免出现后期的检查与修改和阅读,建议一个类一个java文件

2.对象的内存图解

 1.javac 将Java源代码进行编译 生成字节码文件
 2.java 将字节码文件加载进虚拟机中 开始运行程序
    字节码具体被加载在方法区里面
    方法区可以大致分为 非静态方法区/静态方法区
    所有非静态的代码(二进制)内容加载进非静态去
    所有静态的代码(二进制)内容加载进静态区
    JVM接下来会根据参数(java 字节码文件名(类名)) 去静态区找主函数
    将主函数代码加载进虚拟机栈 开始运行
   3.后面的和之前一样

3.静态变量和成员变量的区别

1.生命周期
        成员变量随着对象的创建而创建 随着对象的消亡而消亡
        静态变量随着类的加载而创建 随着程序结束而消失
2.调用方式
        成员变量必须先创建对象 在通过对象去调用
        静态变量可以被对象调用 也可以直接用类调用
3.存储位置
        成员变量存在于堆内存中对象的所属空间里
        静态变量存在于静态方法区中类的所属空间里
4.命名
        成员变量-对象的特有属性
        静态变量-对象的共有属性 类成员

4.代码块

代码块分为局部代码块,构造代码块,静态代码块

局部代码块:

   存在于函数当中(包括函数) for(){...} if(){...} 

构造代码块:

直接在类中出现的{...}
当对象创建一次 构造代码块执行一次
 作用等同于构造函数

  静态代码块:

直接在类中出现的static{...}
当类被加载的时候 仅且只执行一次
作用于 对类进行一些初始化操作 JDBC

可以从中领会到怎么设计
一段优秀的代码;您是一个高级程序员,可以从中全面了解到设计模式以及 Java 的边角技术的使用;您是
一个顶级的系统分析师,可以从中获得共鸣,寻找到项目公共问题的解决办法,那么那些前辈们都设计出了好多种优秀的编码技巧模式
常见的策略模式,代理模式,单例模式,多例模式,工厂方法模式,抽象工厂模式,门面模式,适配器模式,模板方法模式等26种

5.单例模式

这个模式很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一,独苗的意思,因为你的思维是独一份的,古代这种例子好比皇帝,我们认为皇帝就是个单例模式,每天参拜的皇帝是一样的。所以它是绝对的单例模式。

那么这种方法是具体怎样实现的呢

1.既然只能创建一个对象的话 就得不能让外界去创建对象

限制使用new不现实

只能从对象的创建流程中考虑 只要有一个步骤不行 对象就创建不出来
开辟空间分配地址 是由计算机底层决定 我们也控制不了
构造函数执行  只需要将构造函数私有化即可


 2.既然外界不能创建对象 我们还得保证对象的创建

所以我们只能在类内部创建对象
Single s=new Single();
能否写成 成员变量的形式?
所以private static


 3.内部创建出对象 还得向外界提供

因为private 外界不能直接访问 所以见解 向外界提供一个函数 外界通过调用函数获取对象