Java学习笔记之《Java编程思想》——查漏补缺(持续更新)

背景: 总觉得自己对Java很多语法细节没有理解的很清楚,导致最近写代码总感觉不顺畅。于是这段时间学习一下《Java编程思想》这本被称为Java界圣经的书籍,希望在学习的过程中对已有的知识进行查漏补缺,为日后的学习打下牢固的基石。


2018.5.17更

1、Java也有标签机制,但在Java中标签机制只在迭代语句(循环语句)之前起作用。一般与break和continue一起使用。 在不使用标签的情况下,单个循环使用break表示退出本次循环 编译器执行循环之后的语句,使用continue表示结束循环中的某次执行任务进行下一次循环任务;在使用标签的情况下,“break 标签名;”表示退出循环回到标签标记的位置,并且不在执行退出的循环语句,“continue 标签名;”表示回到标签标记的位置,继续执行标签之下的语句(如果接下去的语句是刚刚退出的循环语句,也一样继续执行)。

2、this:只能在方法中使用,表示调用该方法的引用。常用三种方法:1.return this:表示返回调用该方法的引用。2.this.变量:表示获取对象的变量 。3.this(变量):只能用在构造方法中,表示对对象的初始化,并且一个构造方法中只能执行一次this(变量),因为一个对象只能被初始化一次。

3、数组的定义分3种:1.int[] a=new int[N];//定义数组长度为N,数组中的每个数默认初始化(这个例子中每个int类型的数默认初始化为0)。2.int[] a ={1,2,3,4} ;//定义长度为4的数组并且定义了每个数的值。3.int[] a=new int[]{1,2,3,4}//同2一样。

4、static:无论一个类被创造了多少个对象,对象中被定义为static的静态变量或者静态方法都只会被创造一次。并且类中的静态方法只能调用同个类中其他的静态变量或者静态方法。因为静态变量或者静态方法是在对象没有被创造的时候就已经存在了,而非静态类是在创造了对象之后才被创造的。

2018.5.18更

5.访问权限问题:Java访问权限分为四种 :1.public(允许所有程序访问); 2.protected(允许同一个包下的程序以及继承自己的程序访问);3.默认(允许同一个包下的程序访问) ;4.2.private(只允许同一个类下的成员访问);

2018.5.21更

6、程序加载创建顺序问题:编译器首先对最开始找到的类进行加载,当注意到有基类时对基类进行加载,依次类推。之后编译器首先对最底层基类的static变量或模块进行初始化 ,然后是第二个基类的static变量或模块,以此类推直到最外层类的static被加载完成。必要的类都加载完毕后,对象就可以被创建了。 对象创建时所有的基本变量被初始化为默认值,对象引用被初始化为null。之后最底层的基类构造器会被调用,在基类构造器被调用之后,实例成员变量按照其顺序进行初始化,最后执行构造器的其余部分,这个过程依次向外进行。

7、组合和继承,一般组合用的多一些。

8、final:final可用于三个地方:1.变量和引用、2.方法、3.类。当final被用于变量时就规定了变量的数值不可被改变,当用在引用时就表示该引用不可被更改指向其他的对象,但是对象自身却是可以被更改的。当final被用在方法上时,方法将被锁定不允许被覆盖。当final用在类上时,表示该类不允许被继承。

9、被private修饰的方法不是基类接口的一部分,只是隐藏在程序里的一部分,当有子类用public和同样的方法名命名一个方法时,这个方法并没有覆盖基类相同方法名的方法 ,这个方法是只是属于子类的新方法。

2018.5.23更

10、多态:1.基类引用可作为子类的容器(向上转型)当用基类引用指向用new创造的子类对象时,用该引用调用子类重载的方法 调用的是子类中重载的方法。但不可以用基类引用调用基类中没有的方法(向上转型会屏蔽子类中基类没有的方法)【这里默认将最基层的类放在最上端,导出类(继承类)放在下端】。2.只有普通的方法可以是多态,构造器、静态方法、private类不具有多态性。(构造方法实际上是static方法)

11、普通类通过 class....extends 实现多态,接口通过 interface....implements 实现多态。

12、接口:1.接口中的方法只能是抽象方法(所以接口本身就是抽象的);2.无论声不声明接口所有方法都是public权限;3.接口可以包含成员变量,但都被认为是public、static和final的。

13、通过一个例子说明编译器内部执行顺序:

package p171lianxi3;

public abstract class Jilei {
 public abstract void print();
 
 public Jilei() {
	print();
 }
}
package p171lianxi3;

public class Daochulei extends Jilei{
 int a=3;
 public void print() {
	 System.out.print(a);
 }
}
package p171lianxi3;

public class Test {

	public static void main(String[] args) {
		Daochulei lei=new Daochulei();
		lei.print();
	}

}
输出结果:
03

说明:

在main函数中创建了一个Daochulei对象,此时编译器首先到Daochulei去查看发现它有一个基类于是到基类去调用基类的构造器,基类构造器执行的任务是调用Daochulei的print方法于是Daochulei的print方法被调用 print的方法的任务是打印出a的值,但此时a还没有被构造赋值,编译器默认给它赋值为0,所以第一个输出的值为0。之后就执行正常初始化流程【不清楚流程顺序请看第6条】,执行到lei.print();时,a已经完成构造赋值 ,所以第二个输出的值为3。

这里说明了一个问题:当在基类构造器中调用了子类中覆盖的方法,被覆盖的方法会优先被调用。(但是还是要尽量避免在基类中调用子类重载方法 的这种操作)

2018.5.24更

14、接口是实现多重继承的途径,而生成实现接口类对象的典型方式是工厂方法设计模式。

15、接口和抽象类的作用区别:1.一个类只能继承一个抽象类,当类继承了一个抽象类后 这个类只具有它继承的这个抽象类这一个“基类”;2.一个类可以实现多个接口,当类实现了多个接口 这个类就具有他实现的接口的这些“基类”。

16、接口的所有方法必须是抽象方法,而抽象类可以没有抽象方法。

17、抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。

2018.5.25更

18、在不同包下 接口必须是public权限 其他包的程序才可以看到这个接口。

19、外部类和内部类的关系: 内部类可以访问外部类所有成员,但外部类不可以访问内部类private权限的成员(private权限只对同个类下的程序可见)。

20、局部内部类默认情况下只在指定的局部范围内可见。

21、普通内部类(没有static)和嵌套类(static)的区别: 普通内部类依赖于外部类对象,嵌套类不依赖于外部类对象。 例如 当我们要创造一个普通内部类的对象时需要new一个外部类(或者获取一个外部类的实例)然后通过这个new出来的实例再去获得内部类的实例,而如果要创造一个嵌套类的对象 就直接new一个这个嵌套类就可以了。(注意,嵌套类不可以调用外部类的非静态成员,因为非静态成员是对应有对象而言, 而静态成员则是对应类而言)。

22、嵌套类可以放在接口中。

2018.5.31更

23、List、Set、Queue、Map接口的区别:1.List:有序,可重复。实现类:ArrayList、LinkedList。2.Set:无序,不可重复。实现类:HashSet、TreeSet、LinkedHashSet。3.Queue:先进先出。实现类:LinkedList、PriorityQueue。4.Map:键值对概念。实现类:HashMap、TreeMap、LinkedHashList。

24、迭代器:Iterator。 在Collection类中调用iterator()方法可可获得一个Lterator类型对象,其对象类型是Iterator<Collection中的类型>。Iterator常用方法:next()、hasNext()、remove()。

25、升级迭代器:ListIterator。ListIterator继承与Iterator。Iterator只能单向移动,而ListIterator可双向移动 。还可以产生当前迭代器列表中当前位置前后元素的索引,并且用set()方法替换当前列表访问的元素。

26、LinkedList:   调用对应的方法可以将LinkedList用作栈(stark)、队列(queue)。一般运用时将LinkedList对象转型为Queue类型即可。

27、一般常用:ArrayList、LinkedList、HashSet、HashMap。注意,List、Set、Queue都属于Collection,而Map不属于。

2018.6.1更

28String 、StringBuilde、StringBuffer 三者的区别:1.String 速度慢,重新赋值时会产生很多垃圾 靠垃圾回收机制销毁。2.StringBuilde 速度比String快,但线程不安全。3.StringBuffer 速度比String快比StringBuilde慢 ,线程安全。

29、Pattern和Matcher类: Pattern的静态方法compile(String regularExpression)方法可以返回一个按照输入的正则表达式编译的Pattern对象,然后通过这个编译好的Pattern对象调用 matcher(String input)方法得到一个具有匹配信息组的Matcher对象,可以通过Matcher对象查看匹配信息。

30、 boolean Pattern.matches(String regularExpression, String input): Pattern类的静态方法, 可通过这个方法查看匹配结果。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值