gistfile1.txt 十年饮冰 难凉热血田林哥哥复习:Super:用于在子类中,代表父类的特征1.通过在子类的实例方法中,通过super.方法/属性,来调用与父类静态绑定的方法or动态绑定的私有属性
十年饮冰 难凉热血 田林哥哥 复习: Super:用于在子类中,代表父类的特征 1.通过在子类的实例方法中,通过super.方法/属性,来调用与父类静态绑定的方法or动态绑定的私有属性 2.super也可以用于在子类的构造方法中调用父类的构造方法,通过 super(参数签名)来确定具体调用哪个父类的构造方法 语法:只能放在子类构造方法的第一行,在一个构造方法中,只能额外调用一次其他构造方法 PS:构造方法栈:先进后出 this关键字:代表在其所在方法中对当前对象的引用 1.在类本身的方法或者构造方法中引用当前对象的属性或者方法 2.把当前对象的引用作为参数传给其他方法;return this; 3.当this出现在构造方法中时:显示的指定调用本构造方法前,调用本类的哪一个构造方法;this(参数签名); PS:在一个子类的构造方法中,this(参数签名)和super(参数签名)不能同时出现,如果都没有,则默认调用父类的无参的构造方法,如果出现this(参数签名),那就不会默认调用父类的无参构造方法; 子类可以有this,可以有super;但是父类最好不要出现super; 初始化块:用于当创建对象为属性开辟空间之后,为属性初始化 注意:把属性声明在类的最前面,把初始化块放在类的最后面 顺序:先为属性开辟空间,再用初始化块对其初始化,再调用构造方法; 创建对象时,不一定要使用初始化块,但一定要有调用构造方法; 创建一个子类对象的过程: 1.先压栈: 根据person t3 = new Teacher(参数签名1),把该构造方法压栈; 如果在构造方法Teacher(参数签名1)中,第一行有this(参数签名2),再把该构造方法压栈;直到不再调用当前对象的构造方法 再依次把父类的构造方法压栈; 2.先为从父类继承的属性开辟空间,再为子类新增的属性开辟空间 3.再调用父类的初始化块为继承的属性进行初始化 4.再从构造方法栈中依次(后进先出)取出父类的构造方法执行,直到栈中没有父类的构造方法 5.调用子类的初始化块为从父类继承的属性和子类新增的属性初始化 6.再从构造方法栈中依次取出子类的构造方法执行,为属性初始化 新姿势: toString方法: toString是Object的一个方法,而任何一个类都是Object的子类,所以每个类都有一个toString方法,用于返回表示这个对象的字符串(该对象的类型和地址) 如果该类把toString重写(覆盖)了,那就可以提供该类的自定义信息 简单类型的封装类调用toString,会转换为String输出 当要输出对象的地址时,实际上是调用这个对象的valueOf方法,如果该对象不为null,就调用该对象的toString方法。 Static String valueOf(Object obj){ (obj == null)?”null”:obj.toString(); } 并不是一要输出地址就调用toString(),因为这样一旦对象为null,就会产生空指针异常; 而是先调用静态方法valueOf,静态方法是由类调用的,所以不会空指针异常 PS:this.hashCode();//获取对象的十进制地址 Integer.toHexString(对象地址);//转换为16进制的字符串 equals方法: equals也是Object的方法,所以任何一个类都有equals方法 大部分类都没有重写equals,只要没重写equals方法,那直接用 == 来实现 PS: 变量1==变量2 ; 两变量为相同类型,并且指向同一对象,就为true,不然就false 重写equals: 接收的参数类型为Object,会把接收的对象自动进行上转型; 1.先判断接收参数是否为Null,为Null,那就返回false; If(obj == null){ return false;} 2.再判断两变量是否指向同一个对象,那就返回true; If(this == obj){return true;} 3.不满足这两点,再比较两变量是否为同一类型; If(this.getClass().getName()==obj.getClass().getName()){ Return true;//obj指向的是传进引用参数所指的对象 } 或者:if(obj instanceof Citizen) 4.再把形参进行下转型, Citizen c = (citizen)obj; 5.比较对象中封装的数据 Return (this.id).equals(c.id); 多态比较:this == obj;//当前对象类型 == Object类型 Object是任何对象的父类,所以会按照obj所指对象的实际类型来比较 高级类特性: Static关键字: static修饰的属性/方法是和类关联的,不再和实例对象关联,可以直接通过 :类名.属性/方法 调用 static修饰内部类,那就是静态内部类 static不能用于修饰构造方法,因为构造方法要接收对象的this指针 静态属性就是静态全局变量,在加载类的时候在方法区的静态数据区开辟空间,对静态全局变量的任何操作都会反映到整个类的对象 静态初始化块:static{代码块;} 1.加载类,为静态全局变量开辟空间初始化,并且跟类关联 2.调用静态初始化块,来为静态全局变量初始化(只能一次);每个静态初始化块只能执行一次 3.调用主方法 静态初始化块在主方法前调用,不接收this指针; 一般初始化块在主方法创建对象时调用,接收this指针; 单例模型:确保一个类只能自己创建且只有一个实例对象,并且向整个类提供这个实例。 数据共享,项目安全(配合同步),同一时刻只能有一个访问; 降低项目的并发性,增加了耦合性; 单例三要素: private static private public static 静态全局变量 + 私有的构造方法 + 用静态方法创建/获取对象 饥汉模式:一加载单例类,就要为静态全局变量开辟空间,而有某个静态全局变量是指向的是 单例类的对象,所以一加载类,就创建了单例的对象(真猴急) Private static Singleton hungery = new Singleton(); 一个拥有静态全局变量i的对象的属性中一定有对该静态全局变量i的引用,这构成了一个环。 饱汉模式:一加载单例类,就要为静态全局变量开辟空间,没有静态全局变量指向的是单例类的对象,所以并不会一加载类就创建对象,等到主方法要创建单例类对象的时候,再创建对象。 Private static Singleton lazy; 作业:1.创建一个学生类,属性有 String id;boolean sex;String name;int age;double score; 重写该类的equals方法; 2.在静态类的初始化块来定义静态全局变量(饥汉) 不问过往 只奔将来 /*身份证类,用于创建身份证对象,属性为:no(身份证号) * @author:田林 * @version:1.0 * @time:2017.05.28 * */ public class IdentityCardNo { //定义一个静态全局变量instance private static IdentityCardNo instance = null; private String no;//定义属性身份证号 private IdentityCardNo(){ //私有的无参构造函数 } public static IdentityCardNo getIntance(){//获取身份证的方法 if(instance == null){//如果没创建过身份证 System.out.println("第一次创建身份证"); instance = new IdentityCardNo();//就在堆区初始化一个新对象,把地址传给Instance instance.setNo("no20141672");//给该对象的No属性设值 }else{ System.out.println("重复办理身份证,获取旧号码"); } return instance;//返回身份证对象 } public String getNo() { return no; } public void setNo(String no) { this.no = no; } }