1.类是引用数据类型。
2.Static修饰的成员不能访问没有static修饰的成员
3.Field=》成员变量=》包括成员变量和类变量
4.类的构造器看上去没有返回值,其实隐式的返回了该类的一个实例。
5.类不是一种具体的存在,类的实例才是。
6.引用变量更像是C语言中的指针。(java将这个指针封装了起来)
7.如果想希望java垃圾回收机制回收某一个对象,只要把这些对应的引用变量赋值为null即可。
8.this可以代表人和对象,当this出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的。它所代表的对象只能是当前类类型的对象。这个方法被调用的时候,它所代表的对象才能真正确定下来。
9.为了不让自己混淆,千万不要用java实例对象调用static修饰的field或者方法。
10.使用this作为方法的返回值,可以使代码更加的简洁,但是会出现意义模糊的情况。
11.方法中的参数传递===》孙悟空,变一堆孙悟空。。那些变出的孙悟空拥有真孙悟空所有的属性,但是无论变出的孙悟空怎么动,都不会对真孙悟空产生影响。
12.形参个数可以变的方法:最后一个形参的类型后面加... 表示可以接受多个参数值,并且这个参数值被当做数组传入 长度可以变的参数只能放最后一位,并且在调用这个方法时,可以传入多个参数,也可以传入一个数组
13.一个方法调用它本身叫做方法的递归 递归方法的原则要向已知的方向递归,不能变成死循环。
14.方法重载,一个类里面有多个方法名一样的方法 java不允许使用方法返回值实现重载。并且我们尽量不要重载形参可变的方法
15.
成员变量和局部变量
类field 与类共存亡
实例field与实例共存亡
尽量不用实例访问类field的情况,这样会给人误会。
局部变量中除了形参,其他的都要显示的初始化。
赋值动作某种意义上就是一个初始化的工作
16..为了避免出错需要尽量避免局部变量和成员变量同名的情况
17.局部变量不属于任何的类或者类的实例,它只存在于方法的栈内存中。局部变量不需要垃圾回收机制,因为局部变量只保存基本类型的值,或者对象的引用,也因此局部变量所消耗的内存很小。
18.访问控制级别表:
19.如果一个java中所有的类都没有被public修饰,那么这个java文件可以使任何合法的名称。
20.高内聚低耦合。。尽量不要让外部直接操作内部的数据值 get set方法的意义所在。
21.java包机制需要两个方面的保证:一、源文件中使用package语句指定包名,二、class必须放在对应文件夹下面。
22.java默认为类导入了java.lang下所有的类
23.import 和import static 功能非常相似,只是导入的对象不一样。
24.一个对象并不是完全由类的构造器new出来的,实际上在构造器方法内部可以使用this来引用,实际上在调用构造器之前,对象的实例已经有了。。只是此时还不能被外部访问
25.软件开发中有一个规则,不要把一个相同的代码写超过两次以上。
26.用扩展来描述extents关键字比用继承更好,更恰当。
27.java只允许类只有一个直接的父类,但是间接父类可以有很多。
28.覆盖(overide) 子类重写了父类的方法(非private、default关键字修饰的方法)。 并且要遵循“两同两小一大”的原则
两同:
1)方法名
2)形参列表
两小:
1)返回值类型比父类更小或相等
2)异常比父类方法更小或相等
一大:
子类权限比父类大或相等
29.当调用构造器初始化一个对象时,其父类的构造器总是最先被调用
子类构造器执行体既没有super又没有this关键字的时候,系统将会隐式的调用父类的无参构造器。
30.java的多态概念:java的引用变量存在两个类型:一个是编译时的类型,一个是运行时的类型。如果编译和运行的类型不一样,可以理解为多态。引用变量在编译时期只能调用编译时期类型所具有的方法
31.方法:引用变量在编译时期只能调用编译时期类型所具有的方法
实例Field:系统总是会试图访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field
32.为了提高代码的强壮性,可以在强制类型转换之前加入instanceOf运算符来判断
33.继承虽好但会破坏java的封装为了避免子类随意重写父类方法,可以再父类public
方法前用final修饰;
但用组合可以巧妙的避开这点。
为了保证父类有良好的封装性,不会被子类随意的改变,设计父类通常的准则如下:
1.尽量将父类的内部数据设置为private
2.如果父类中的方法需要被外部类调用,但又不希望自己的子类修改它,可以加上修饰关键字final。
3.如果希望自己的某个方法被子类重写,但又不希望被别的类访问,可以用protected。
4.尽量不要在父类的构造器中调用将被子类重写的方法。
package com.gu.test; class Super { int i = 10; Super() { print(); i = 20; } void print() { System.out.print(i); } } public class Sub extends Super { int j = 30; Sub() { print(); j = 40; } void print() { System.out.print(j); } public static void main(String[] args) { System.out.print(new Sub().j); } }
34.is-a have-a 继承和组合的开销本质不会有差别。
把一个抽象的类改造成适用于某些特定需求的类====》继承
如果两个类之间有明显的整体部分的关系,应该使用组合。===》组合
35.初始化块的使用:一个类尽量只有一个初始化块
36.java创建一个对象时的初始化顺序:先执行初始化块或者声明field时指定的初始值,再执行构造器里的。构造器是先执行父类的构造器,再执行子类的构造器,因此初始化块和field声明的代码谁在后谁后执行
37.静态初始化块也不能访问非静态成员。
38.Abstract修饰的类只能被继承,abstract修饰的方法必须由子类实现(重写),final修饰的类不能被继承,final修饰的类不能被重写。====》final和abstract永远不能同时使用;
Abstract不能修饰field和构造器。并且没有类的抽象方法。即static无法与abstract一起用。
Abstract必须要被子类重写,所以private不能与abstract公用。
39.一个接口可以有多个直接父接口,但是接口只能继承接口,不能继承类。
40.一个类必须实现实现接口的所有抽象方法,否则要将其定义成抽象类。
41.内部类:定义在其他类内部的类被称为内部类。
1.内部类提供了更好的封装。当一个类被定义为内部类,那么这个类对于除了包含自己的外部类之外的所有类都是透明的。
2.内部类可以直接访问外部类的私有数据。
3.匿名内部类适用于创建那些仅需要一次使用的类。
42.成员内部类和局部内部类:成员内部类是类的成员。局部内部类在方法中,不是类成员。
43.非静态内部类的成员可以访问外部类的private变量。但是外部类不可以访问内部类的成员。必须要在外部类中创建该内部类的实例才可以进行访问。
44.接口内部类只能是静态内部类。
public class QuestionMain implements ITest { public static void main(String[] args) { ITest.TestInternal.test(new QuestionMain()); } @Override public void print() { System.out.println("真正实现方法"); } } interface ITest { void print(); public static class TestInternal { public static void test(ITest test) { test.print(); } } }