数组对象工具的建立(重要的是这种思想)
主函数是静态的,主函数需要调用的也需要static。
当有2个.java文件时,先编译含有函数功能的.java文件,再编译含主函数的.java文件。(因为主函数中要用到该函数)
Question:编译含main的.java文件,会出现2个.class文件?
其实系统已经帮你做过来了这个事情。(java编译器发现该类中用到了其他类,会去classpath或者.(当前目录)下去找,若没有仍然没有会去和这个类名相同的.java文件,找到后再对其进行编译。)
有些类中只提供了工具和方法,一个非静态方法都没有,全是静态的。那么就用static,不需要创建对象(也可以创建,就是有点多余,没有意思)那么干脆就不让你创建对象,可以在类中的构造函数私有化使用return语句(对象一创建就需要初始化)。
文档注释(这一集没有细看):
Javadoc(java安装目录下Bin文件下的一个工具)可以提取文档注释。
面向对象(单例设计模式)
设计模式:对问题行之有效的解决方式都记录下来,比较通用的东西。(对产生的问题优化的过程记录下来了)
单例设计模式:解决的问题:可以保证一个类在内存中的对象唯一性。
需求分析:什么时候需要保证类在内存中的对象唯一性呢?就是想实现配置信息的共享操作(就是A对配置信息操作过后能保存,B对配置信息操作时和A初步对配置信息创建的对象不一样)。 解决方案:用全静态(生命周期过长,不能采纳这样的方法)。
如何保证对象的唯一性:
1. 不允许其他程序用new创建该类对象。
2. 在该类中创建一个本类实例。
3. 对外提供一个方法,让其他程序可以获取该对象。
步骤(牛人已经想好了的办法):
1. 私有化该类构造函数。(让其无法初始化对象)
2. 通过new在本类中创建一个本类对象。
3. 定义一个公有的方法,将创建的对象返回。
Class Single { Static Single s=new Single(); //步骤2 类名调用的前提 Private Single() //步骤1 { } Public static Single getInstance() 类名调用的前提 { Return s; //步骤3 } } Class SingleDemo { Public static void main(String[] args) { New Single().getInstance();(无法new了,人家已经私有化了。我们是不能创建对象,可以考虑类名调用) Single ss=Single.getInstance();//这样我们就拿到了这个类的实例。 Single ss=Single.s;//右边因为是静态变量,可以直接引用。这样做虽然可以用,但是不可控。用上面的可以给获取实例加入一些条件,往实参里面传入参数,符合就给你用,不符合就不让你用。有了方法就有了可控的可能,例如可以在方法中加入if。
} }
可以测试:
Single s1=Single.getInstance(); Single s2=Single.getInstance(); Sop(s1==s2); //测试结果为真,可以保证唯一性。
内存图解:
单例设计模式(懒汉式)
Class Single //类一加载,对象就已经存在了。饿汉式(开发多用这个,懒汉式被多线程并发访问时,有可能不能保证对象的唯一性,存在安全隐患)用单例的模式就是为了获取你对象的。 { Static Single s=new Single(); //步骤2 类名调用的前提 Private Single() //步骤1 { } Public static Single getInstance() 类名调用的前提 { Return s; //步骤3 } }
饿汉式
Class Single2 //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象 //延迟加载形式(面试多考这个)懒汉式 { Private static Single2 s=null; Private Single2() { } Private static Single2 getInstance() { If(s==null) S=new Single2(); Return s; } }
继承
面向对象的三大属性:(封装、继承、多态)
父类(基类、超类)
继承好处:1.提高代码的复用性
2. 类与类之间产生关系,给多态产生前提。(没有继承就没有多态。)
继承就是向上不断抽取共性的过程。
单继承与多继承
Java中支持单继承,不直接支持多继承,但对C++中的多继承进行改良。
单继承(一个子类只能有一个直接父类)
多继承(一个子类中有多个直接父类,java中对其进行改良了) 因为当2个父类中有2个相同的方法时,子类中调用时不知道该调用哪一个。但是java支持多重继承。
当要使用一个继承体系时:
1. 查看该体系中的顶层类,了解该体系的基本功能
2. 创建体系最子类对象,完成功能的使用
在java中多继承是通过“多实现”来实现的。
定义继承
什么时候定义继承? 存在着所属关系的时候(xxx是yyy中的一种),就定义继承。
子类中成员变量的特点:
Class Fu { Int num=4; } Class Zi extends Fu { Int num=5; Void show() { Sop(num+”...”+num); } } Class ExtendsDemo2 { Public static void main(String[] args) { Zi z=new Zi(); Z.show(); } }
打印结果为:5...5(自己本空间有就不去父类找)跟我猜测的结果一样
但是并不是覆盖了。但是怎么去操作父类中的num呢?
当本类的成员和局部变量重名用this区分,类似的,当子类中的成员变量同名用super来区分。This和super的用法很相似 。
This:代表了一个本类对象的引用
Super:代表了一个父类空间。
子父类内存图解(了解即可,开发中用的很少,父类有的一般子类不会重新写,一般拿来直接用即可,而且通常情况下num均是私有的,直接使用setNumber方法和getNumber方法即可):
子类不能直接访问父类私有内容。但是可以通过super.getNumber()可以访问。(但是面试常见)
子父类成员函数特点:
但是特殊情况,子类和父类中成员函数一致时。会运行子类函数,类似于“覆盖”,但是不属于覆盖,这是函数在子父类中的特性(函数有2个特性:1.重载。同一个类中2.覆盖:子类中,覆盖也称之为重写)。直接运行自己的成员函数即可:
覆盖的前提:函数声明必须得一致,而重载不区分函数返回值类型。
覆盖注意事项:
1. 子类覆盖父类方法,子类权限必须要大于等于父类权限。(public、privatae以及默认权限)
2. 当权限相同时,若父类的方法为static时,子类不能对其覆盖。或者子类单方为static也不行,只有当双方都为static才可以覆盖。(这种情况很少见,等学了多态就清楚原因)
什么时候使用覆盖操作?
不建议对源代码进行直接修改,可以再搞一个类。当对一个类进行子类的拓展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有功能,就要用覆盖操作来完成。