Java疯狂讲义第五章重要知识点

1.static 的真正作用:相当于一个标记,有static修饰的成员属于类本身,没有static修饰的成员属于该类的实例

2.构造器的返回值是隐性的,返回当前类的实例。

3.没有static 修饰的成员变量和成员方法(实例方法)都必须用对象来调用(思考1:某类中的静态方法可以调用另一个静态方法而不能调用另一个实例方法? 而实例方法为什么可以调用另一个实例方法) P113

4.this在构造器方法中引用正在初始化的对象,在方法中引用调用该方法的对象

5.同方法不同代码块局部变量可以同名,先定义代码块中局部变量后定义方法中局部变量那么可以同名(反过来的顺序书上没提)

6.局部变量直到程序为这个变量赋值时,系统才会为局部变量分配内存

 

7.(重点,变量的使用规则)能用局部变量就尽量不要使用成员变量或类变量。因为成员变量或类变量将被放在堆内存中,而局部变量则被放在方法栈中,栈内存的变量无须系统垃圾回收,而堆内存需要,栈内存中的变量的作用域是从初始化开始到方法或代码块运行完成而结束,而堆内存中的变量作用域将会扩大到类或对象的存在范围。在该需要使用局部变量而使用类变量或成员变量的时候将导致两点不好的情况:

增大了变量的作用域这不利于提高程序的内聚性

扩大了变量的生存时间,这将导致更大的内存开销(能用代码块局部变量就不要用方法局部变量-->减少生存时间)

思考2:什么时候使用类变量,什么时候使用实例变量?5.3.4

8.外部类不能用private 和 protected修饰,因为外部类不在任何类的内部,所以他们对其没有意义5.4.2

9.高内聚:尽可能把模块的内部数据,功能实现细节隐藏在模块内部独立完成,不允许外部直接干预

   低耦合:仅暴露少量的方法给外部使用

10.访问修饰符使用的基本规则:

绝大多数成员变量应该使用private修饰,只有一些static修饰的、类似全局变量的成员变量才可以考虑用public

如果某个类主要用作其他类的父类,该的大部分方法可能只希望被子类重写,而不希望被外界调用,用protected

希望暴露给其他类的用public。 如构造方法 和 外部类

 

11.建议编译源文件时 javac -d *.java  加上 -d 因为在源文件中有指定包时,带上-d指令才会生成文件夹。即使要把.class文件放在当前路径下 也建议使用 java -d . *.java

12.package语句必须作为源文件的第一条非注释性语句

13.jdk1.5之后增加了import static用于导入静态成员变量或静态方法,导入后调用类的静态成员或方法时,可以直接省略类,即import static java.lang.System.*后 System.out 可以直接写成out5.4.3

14.构造函数的作用:返回对象的引用,系统分配内存和初始化在执行构造函数前就完成了5.5.1提问处)

15.因为构造器不能直接被调用只能通过new关键字来调用。因此若想在一个构造器中调用同类的另一个构造器方法又不想它创建对象的话可以使用this。且使用this调用另一个重载构造器只能在构造器中使用5.5.2

16.方法重写的规则“两同两小一大”,方法名、形参相同;返回值、声明声明抛出的异常类比父类小或相等;访问权限修饰符比父类大。5.6.2

 

17.若子类覆盖的是父类的类变量或类方法可以通过父类名作为调用者来访问被覆盖的类变量或类方法,若子类想访问父类中定义的被隐藏的实例方法或实例变量,可以使用super来调用。5.6.3

18.super和this   

不同点:在一个类中调用不同的重载构造器可以使用this,子类中调用父类的构造器使用super。

共同点:在构造器中使用使用superthis调用构造器(父类构造器或同类重载的构造器)时,都必须出现在构造器执行体的第一行它们都不能出现在静态方法中(5.6.4)

19. java引用变量有两种类型:一个是编译时类型,一个的运行类型。编译时类型由声明该变量的类型决定,运行时类型由实际赋给该变量的对象决定。引用变量在编译阶段只能调用其编译时类型所具有的方法,但在运行时则执行它运行时类型所具有的方法。因此Object a =new Person();只能调用子类中重写的方法。而通过引用变量来访问其包含的实例变量时,系统总是试图访问他编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。所以实例方法具有多态性,而实例变量不具有多态性5.7.1多态)

20.

instanceof运算符的作用: 

在进行强制类型转换前,首先判断前一个对象是否是后一个对象的实例,是否可以成功转换,从而保证代码的健壮性5.7.3instanceof运算符)

使用需知:使用instanceof运算符时,需注意前面的操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子的继承关系。  String hello = "hello";   hello instanceof Math ;hello的编译时类型为String 与Math不具有父子继承关系,编译时错误 。  Object hello = "hello";   hello instanceof Math; hello 的编译时类型为Object 与Math具有父子继承关系,编译通过,运行返回false。

21.为保证父类的封装性,父类的设计应遵循如下规则5.8.1 使用继承的注意点)

尽量隐藏父类的内部数据,成员变量用private修饰,不让之类直接访问父类的成员变量。

        父类中只为辅助其他的工具方法,应该使用private修饰,不让子类访问该方法。若父类中方法需要被外界调用则必须使用public修饰但不想要子类重写,可以用final修饰。希望方法被子类重写而不希望被其他类自由调用可以使用protected修饰

尽量不要在构造器中调用将要被子类重写的方法()。

22.何时需要从父类派生新的子类呢?需要具备以下两个条件之一5.8.1 使用继承的注意点)

子类需要增加新的属性,不仅仅是属性值的改变,如Student继承Person,而Student需要grade属性来保存年级

子类需要增加自己独有的行为方式,如Teacher继承Person,需要teaching()来描述独有的方法:教学。

23.组合和继承  思考3:组合和继承达到的效果类似,系统的开销也近乎相同,因此怎样区别使用组合还是继承呢? 5.8.2利用组合实现复用)

24. Java创建一个对象时,系统先为该对象的所有实例变量分配内存(前提是该类以及被加载过了),接着程序开始为这些实例变量进行初始化。初始化顺序为:先执行初始化代码块或声明实例变量为指定的初始值(在两个地方指定初始化的执行允许与源代码的排列顺序相同),在执行构造器里指定的初始值5.9.1初始化块)

25.初始化块的基本用法:如果有一段初始化处理代码对所有的对象完全相同,且无须接收任何参数,就可以把这段初始化处理代码提取到初始化块中。实际上初始化块是一个假象,使用javac编译Java类后,该Java类的初始化块会消失,它里面的代码会被“还原”到每个构造器所有代码的前面5.9.2初始化块和构造器)

26..初始化块使用static修饰就是静态初始化块。静态初始化块中代码将在类初始化阶段执行,初始化块中代码将在创建对象时执行,因此静态初始化块总是比普通初始化块先执行。与普通初始化块和构造器类型的是,类初始化阶段执行静态代码块时,不仅会执行本类的静态初始化块,而且还会一直追溯到java.lang.Object类(如果它包含静态代码块),然后执行最高父类的静态代码块,最后才执行该类的静态初始化块。5.9.3静态初始化块)

 

答案:

思考1:若静态方法能调用实例方法,那么通过类来调用静态方法时,该静态方法中的实例方法无对象来调用。显然不行,而实例方法调用另一个实例方法,它的调用者默认为this(当前对象(实例方法中))。同理static中不能使用this引用

思考2:所有实例的某个信息完全相同使用类变量,不同使用实例变量(如人的眼睛数量和身高体重)

思考3:根据表达的含义进行区别,组合表达是是has-a关系,继承表达的是is-a关系。 即老师是人,人有两条手臂组成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值