发表于: 2018-03-04 22:58:12
2 714
今天完成的事情:
继续“万恶”的基础知识的学习:
1.对象作为方法参数
a.当对象作为方法参数时,把实参对象的值传递给形参,现在形参对象和实参对象指向堆中同一对象。
b.在方法体中通过形参修改了对象的属性值,实际上也是修改了实参对象的属性值。
c.在方法体中,对形参对象重新赋值,形参对象指向了一个新的对象,没有影响实参对象,再对形参对象做任何修改,都跟实参对象无关
2.匿名对象
a.之前创建对象格式为 类名 对象名=new 构造方法();如Person p1 =new Person();此时通过new运算符在堆中创建的才是真正的对象,而p1只是对象名,用来访问堆中的对象,并非真正的对象。
b.匿名对象就是没有对象名的对象,如new Person();
c.应用场景:如果某个对象的方法,就使用一次,以后再也不用,就可以使用匿名对象,防止内存过度使用;如果在调用某个方法时,这个方法需要一个对象参数,具体对象并不影响方法的使用,此时实参对象可以是匿名对象。两种区别在于第一个是拥有方法的对象需要匿名,第二个是方法作用的对象需要匿名。
3.封装
a.目的:防止用户直接修改属性值导致的不安全。
b.如何实现封装:①把成员变量设置私有化,即用private修饰,使其只能在当前类中使用。
②提供公共的getter()/setter()方法实现对私有数据的访问。
c.getter()方法在类中就需要定义,定义格式为 get+字段名();第二个单词起首字母就得大写,如getName();
d.getter()方法的返回值类型就是字段类型,其只提供数据输出,故无参数。
e.setter()方法的方法名为set+字段名();第二个单词起首字母就得大写,如setName();
f.setter()方法的作用使设置字段的值,需要一个参数来接收数据,不需要返回值,如果必要可以在setter()方法中对参数接收的数据进行合理性的验证
g.如果某字段只提供了getter()而无setter()就称为只读数据,反之为只写数据。
h.建议:在定义实体类时,将所有字段设置为private,如果需要访问就提供对应的get/set方法,同时只提供无参的构造方法,不提供有参的构造方法,以免破坏数据封装性。
4.静态方法
a.使用static修饰的方法
b.在静态方法中可以直接使用静态成员,不能直接使用非静态成员,因为非静态成员属于某个具体对象,在使用静态方法时还没有创建对象,而在实例方法中,可以直接使用静态成员。
c.静态方法不属于某个具体对象,而是某个类共享。
d.建议直接使用类名来调用静态方法,因为何具体对象无关。
e.静态方法应用场景:一般在定义工具类时,可以用静态方法,从而达到方便的调用。
5静态构造代码块
a.使用static可以修饰构造代码块,称为静态构造代码块。
b.在使用某个类时,类加载器把字节码文件加载到内存中,在类使用之前需要对类进行初始化,类初始化之前先执行静态构造代码块。
c.因为类的加载只有一次,所以静态构造代码块也只加载一次,而不会像普通构造代码块每次new时都会执行一次。
d.应用场景:有时在使用某个类时,可能需要依赖一些外部资源,在使用类之前需要先把这些资源加载到类中,既可以吧加载外部资源的操作放在静态构造代码块中。
6.继承
a.使用extents关键字实现继承。如Students extents Person;则Students 类称为子类/派生类,Person 类称为父类/基类/超类(涉及super关键字)。
b.子类继承了父类后,就自动拥有了父类中定义的实例变量和实例对象,但是,静态成员不参与继承。通过子类名或子类对象名虽然可以访问到父类的静态变量,但是不是继承。
c.在子类中,可以对父类进行扩展,即增加子类特有的属性和方法。
d.不能为了代码复用而乱用继承,只有当子类is a 父类时,才可以使用继承。
e.父类是通用类,子类是特殊类,子类是父类的一种。整体与部分的类,建议使用组合而非继承,即把部件作为整体的一个属性。
f.如果在子类中定义了和父类继承下来的成员变量重名的成员时,则通过子类对象访问的成员是子类中添加的新成员;而通过父类中继承的方法所访问的则是父类中的成员;通过子类新建的方法访问的是子类的成员。若想访问以父类继承下来的老成员,可以使用super关键词super.成员变量名,若不存在访问冲突,super可以省略,但建议不省略,以方便代码阅读。
g.在继承时,构造方法不能被继承。通过子类创建对象时,要调用子类构造方法,在子类构造方法执行之前,会先执行父类的构造方法。默认情况下,子类构造方法会调用父类的无参构造,如果父类没有无参构造,系统会编译报错。在子类的构造方法中,可以使用super()来显示的调用父类的指定有参构造方法。子类构造方法也可以使用this()来调用其他的构造方法,但是不能在同一构造方法中既有this又有super,因为super()也必须作为子类构造方法的第一条语句。(深深明白为啥老大说千万别用继承。。。)
明天计划的事情:
现在都不敢说每天必须看完多少了,因为永远不知道下一个知识点要卡多久哈哈哈
遇到的问题:
继承里面子类和父类构造方法那都看晕了,以后能少用就少用吧。
收获:
对封装和继承有了比较直观的理解了,但是没有demo因为今天没写代码。。。
评论