一. this和super static
this:
代表子类本身对象.当将局部变量赋值给成员变量,且为非static的即可以用对象进行访问.
this()代表当前类中的其他构造方法,专用于构造方法调用构造方法,当显示任何一个构造方法时,默认的无参构造就被覆盖了,若缺少属性,就使用数据类型默认值来代替,如果需要此属性,就用get/set方法补充数值
super:
代表父类。super()代表父类中的构造方法
调用父类构造方法必须放在第一行.
注:
1.当子类继承父类时,父类中的显示构造也必须提供对应的构造,子类至少提供一个。
2.在任何一个构造方法中super()和this()不能共存(**why?**)
A继承了B,在构造A时要调用A的构造方法,所有构造方法中第一行默认都是super()/super(参数),会先构造父类,如果没有直接父类,则构造Object
在任何一个类中,静态是优先于对象属性和方法被加载到内存中,再普通域,再执行构造方法
由于this也会调用super,这样无形之中调用两次父类,由于Java是单继承,所以不能共存
**this对象哪来的??**
二 static 和final
**static**:
static是静态的,也成称为类的
static的属性叫做类属性,方法叫做类方法
全局的:如果存在多对象,无论哪一个对象对类作出改变其他对象都会受到影响
**final**:
final代表最终,不可改变
可以修饰
类:
抽象类和接口是不可以被修饰的,因为无论还是抽象还是接口都是为了让别人来继承或者实现的,而final不可以被继承和实现
如:String类是不能被继承
属性:
基本数据类型:值不可以改变
引用数据类型:
final String str=new String();
指str不能指向一个新的对象,因为str中保存的是堆中对象的地址,即str的值就是一个地址,无法改变.即地址不可以改变
方法:
不可以被重写,可以被重写和重载
三. 重写和重载
重载(overload):静态多态
指在同一类中方法同名参数的体现形式
1.参数的个数不同
2.参数的类型不同
3.在类型不同,个数相同的情况下,哪怕是改变一下顺序,也认为是重载如:
public void A(double a,int b){}
public void A(int b,double a){}
重写(overwrite):动态多态.可以体现为同一种行为,不同的体现方式
子类重写父类方法
可以改变的有:
1.访问修饰符:子类可以修改,但是修改后不可以小于父类的范围
2.返回值类型:不可改变
拓展:void可以有返回值,只能是return
3.方法名称:不可以改变
4.方法参数:不可以改变
5.方法体:可以修改
四.单例模式
详细参考文献[JAVA设计模式之单例模式 ](http://blog.csdn.net/jason0539/article/details/23297037)
思考:
1.单例模式有懒汉和饿汉2种写法,有什么区别各怎么写
练习:
1.基于单例模式,要求对象只能被实例化3次,改怎么写
public class Test {
public static void main(String[] args) {
SingleLenton singleLenton1=SingleLenton.getInstence();
SingleLenton singleLenton2=SingleLenton.getInstence();
System.out.println(singleLenton1==singleLenton2);//返回true
}
}
/**
* 单例模式:
* 只产生一个实例.
* 针对工具类等需要频繁加载到内存时可以考虑使用单例模式
* 思考过程:
* 1.什么能产生对象
* new+构造方法(一般使用此方式)
* 克隆 args.clone()
* 反射 根据类名来产生对象
* 2.怎么限制
* new 是关键字,无法改变,能改变的只有构造方法
* A a=new A();A()是构造方法,可以限制访问
* Created by HowellZhang on 2016/8/6.
* 3.自行实例化对象
* 4.封装一个方法,吧对象传送到外面
*/
public class SingleLenton {//这是饿汉模式
/**
* 用private限制访问,即只有本类可以访问
*/
private SingleLenton(){}
private static SingleLenton single=new SingleLenton();//自行实例化对象
public static SingleLenton getInstence(){//没有对象,所以方法要改为类方法
return single;//因为static只能访问static,所以成员变量也需static
}
}
public class SingleLenton {//懒汉模式
private SingleLenton(){}
private static SingleLenton single=null;
public static SingleLenton getInstence(){
if (single==null)
single=new SingleLenton();
return single;
}
}