当前位置 : 主页 > 编程语言 > c++ >

java基础笔记(十三)

来源:互联网 收集:自由互联 发布时间:2021-07-03
gistfile1.txt 十年饮冰 难凉热血田林哥哥复习:Super:用于在子类中,代表父类的特征1.通过在子类的实例方法中,通过super.方法/属性,来调用与父类静态绑定的方法or动态绑定的私有属性
gistfile1.txt
十年饮冰 难凉热血
田林哥哥

复习:

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;
		}
		
	}
网友评论