java学习笔记(word文档备注不能正常显示,如有错误,忘不吝指正)



1.        定义常量: final double PI=3.1415926按照习惯常量用大写字母命名

2.        System.exit(0);非零的时候表示非正常终止

3.        变量定义时可以不赋值,但是在调用的时候就需要。如果是成员变量的话,系统会给他初始化,赋默认值,比如int0,boolean类型为flaseString类型为null等。

但是如果是方法里面定义的变量(局部变量),系统不会给他赋值,在调用之前需要明确给他指定一个值,否则编译器会报错;对于只负责接收一个表达式的值的局部变量可以不初始化,参与运算和直接输出等其它情况的局部变量需要初始化

4.        增量和减量运算符也可以用于char型变量,eg:char ch='a';System.out.println(++ch);

5.        循环控制中不要比较浮点数相等。因为浮点数是近似的……即使data的值为0,也可能能使(data!=0)为真。

6.        如果子类的构造方法中没有显式地调用基类的构造方法,则系统默认调用基类无参数的构造方法。

如果子类构造方法中没有显式调用基类构造方法,而基类中又没有无参构造方法,则编译出错。

7.        set classpath  = .; c:\book;句点表示当前目录总在classpath中。不同的目录中有两个同名的类,Java使用首先找到的类。

8.        一个java文件中可以有多个类,但是最多只能有一个public class类。

9.        一个基类的引用类型变量可以“指向”其子类对象。一个基类的引用不可以访问其子类对象“新增加”的成员(属性和方法)。

10.    (子类或者基类instaceof基类)  ==  true   即子类可以是基类的实例。

11.    基类指针指向子类对象时,(基类 instanceof 子类)  也是true。

基类指针没有指向子类对象时 (基类instanceof 子类)是false,此时基类可以强制类型转换为子类。

12.    多态、动态绑定。调方法的时候,只要方法“重写(不是子类自己的方法,必须和父类方法同名、同参数)”了,实际当中new    的是那个对象,就调该对象相应的方法。(出现基类指针)

13.    多态存在要有3个条件:继承;重写;父类引用指向子类对象。

14.    接口是一种特殊的抽象类。只有常量(final修饰的)和方法的定义(即抽象方法),没有变量和方法的实现。没有“{}”

15.    "类的类"  :   String类型是Class类的对象, jdk api中的类都是class类的对象。自己定义的类也是class类的对象。

int.class.getClass().getName()等于class

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的

16.    bootstrap class loader: 引导类加载器,最根本的类加载器,用本地语言写的,C++等,并且拿不出此classloader的名字(拿出来是null)。加载jdk核心类。

         extesion class loader:加载jre/lib/ext目录下的类

         application class loader:装载自己定义的类  ClassLoader.getSystemClassLoader()

         其他的类加载器:SecureClassLoader  URLClassLoader

17.    classloader在加载类的时候,先看一下父类加载器有没有加载该类,如果已经加载过了,就不会再次加载。eg:自己写的java.lang.String加载的时候,父类加载已经加载过该类,所以自己写的永远不会被加载。

18.    知道类名字符串形式,可以通过Class className = Class.forName(str)返回类名,然后用Object o =new className();

19.    类定义中,在其内部类名 = 类名.class

20.    getClassLoader().getResourceAsStream("文件名") 用类加载器读取指定资源的流

21.    Properties 继承map接口

22.    冒择路(插入)兮(希尔)快归堆

23.    要排序,要么实现comparable接口,要么用排序方法传比较器(比较器要实现comparator接口)。

24.    注意泛型,不说明具体类型的话,基本就是object类型了,要注意强制转换成具体类型。

25.    要实现jdk中的接口的话,要加上包名。(也可import)

eg:public class Cat implements java.lang.Comparable<Cat>{}

26.    策略模式:comparable comparator接口

27.    Iterator模式

28.    工厂系列模式:

         单例:私有构造方法,getIntance()方法,私有静态对象(限定一个);

         方法中控制了产生对象的逻辑,都可以称之为工厂相关的方法。

private static Car car = new car();单例

         private static List<car> cars =new ArrayList();多例

         jdbc 连接池 多例; factory 工厂 产生对象;getInstance 单例 多例

         简单工厂(产生对象) 工厂泛滥

抽象工厂(与一系列对象有关,因为继承抽象方法可以产生很多具体工厂,一系列不同实现方法的对象)产生种类的话要给每个工厂都添加

         工厂可以有其他条件再new,比直接new多了限定条件。

29.    new FileInputStream("文件路径") 该文件路径相对于项目而言。

ClassLoader下的getResourceAsStream(“文件路径”)从用来加载类的搜索路径打开指定资源,即相对于包的顶层目录。

30.    Class.forName("类名")利用反射机制加载该类到内存,然后调用newInstance()产生对象。

31.    聚合:一个类里面有另一个类。

         代理(某种方法需要加额外处理,子类,或者聚合类就是代理):继承,聚合

聚合实现代理减少了类爆炸。构造函数可以传父类引用,减少类个数。实现了共同接口,代理之间可以相互代理。

         静态代理:具体代理java文件会直接写在项目下。每个代理都要具体写出来。

动态代理:实现了某个接口的一段代码String被动态调用,编译。不用具体写出来某个代理java文件,调用时动态产生。

32.    System.out.println(System.getProperty("user.dir"));拿到当前工作目录

33.    windows中回车换行"\r\n"

34.    IOC :inversion ofcontrol控制反转。设计模式,spring实现了该模式。以前对象之间的调用,用new来产生,现在交给ioc容器容器控制(控制权限变了即控制反转),需要调用的时候,ioc容器会产生对象,注入到调用者哪里(所以也叫依赖注入,一个对象依赖的另外一个对象被注入)。ioc要产生对象,就要用到反射机制产生类产生对象。

         1.spring bean工厂/bean容器/ioc:产生对象的时候直接读取配置文件中的“值” 利用反射来实现该对象,返回对象。

         2.spring bean工厂的模拟实现:Map<StringObject> 容器;getBean(String)的时候从该容器中拿到对象值(对象);当然还有一个读取配置文件的方法ClassPathXmlApplicationContext,将配置文件的所有键-值对put进map容器;

         3.BeanFactory f = newClassPathXmlApplicationContext(application.xml) Object o =f.getBean("key")

35.    AOP:aspectoriented programming 面向切面编程;不改变原来实现,就可以在其前后加上一些内容(动态代理);JBoss4.0就采用了aop。日志、权限、事务等实现。

36.    测量方法运行时间:System.currentTimeMillis()

37.    jdk api中ClassparameterTypes。  eg: int.class / String/Cat.class/接口等

38.    new Object[]{} == new  Object[0];

39.    过滤器,过滤器链:Filter 接口,实现Filter接口的类,过滤器数组。

nextFilter    (ResposeRequest) 压栈

40.    Command模式 Bridge模式 State模式 Mediator(调停者) Facade(门面)  Adapter

桥接模式:如果子类在扩展上有2个维度,为了解耦合,来解决他们的排列组合问题

(用聚合代替继承,聚合就是一个类里面拥有另一个类的引用)

41.    Adapter:进出2接口 io包中inputStreamReader

42.    侦听器:XXXListener  eg:MouseListener

注册:把侦听器向组件注册。利用组件的addXXXListener(XXXListener m)方法。

事件:XXXEvent 组件产生事件。产生的具体事件调用侦听器中事件对象的的具体方法(要重写侦听器接口中的具体方法)。

43.    持有对方引用。一个类A中有另外一个类B的对象,在类A中可以写new B(this),在类B中构造方法就可以传A引用进去,从而在类B中可以调用a中的成员变量和方法。

也可以是这样的:类A,类B中构造方法参数是A对象,然后类C中new一个类A对象传递给类B。

也就是说一个类中构造方法有另外一个类对象就算持有了对方的引用。可以调用对方的成员变量和方法。

44.    内部类:类的里面,方法的外面。内部类可以直接访问外部包装类(或其父类)的成员变量和方法,相当于持有外部类的引用。类部内编译出来的class文件名“外部类$内部类.class”。可以防止不应该被其它类进行访问。A接口有f()方法,B接口也有f()方法,C实现了A,B接口,这两个方法一个可以写在包装类,一个可以写在内部类。

45.    局部类(也叫匿名内部类):类里面方法的里面。类A中方法参数调用了类B对象,可以把类B对象写成[new父类名可以是接口() {方法体}]。逻辑比较简单,代码少,改动小的时候可以使用匿名类。

46.    XXXAdapter接口实现的时候只需写特定方法即可。

47.    属性文件要写全类名,包不能忘记。

48.    单例实现读取配置文件时(就一个properties对象,所以叫单例):可以在封装好的类中建立一个static Properties对象,然后一段读取文件的静态代码static{代码行};这样以后就会在内存中只加载一个properties对象,一次io操作的static代码(io读取很浪费时间的)。更改配置文件后要重新加载一次单例代码段。(单例加载到内存了,也就是“缓存”)

49.    类中可以new自己。类B要调用类A的成员变量或者方法,要么持有对方引用,要么内部类,局部类。当然继承也可以。

50.    静态main方法中不能直接new内部类,可以“new包装类().new内部类()”。或者在类里面,main方法外面,写一个方法,此方法中可以new内部类,然后main方法中"new包装类.方法名()"。(因为main方法是静态方法,“new内部类()”会产生非静态变量this,从静态方法吧(上下文)不能引用非静态变量this内部类可以直接调用封装类(外部类)的成员,也可以写成“外部类.this.成员”。内部类要引用外部类对象就要用“外部类.this”。

51.    paint(Graphics g),调用的时候由系统初始化g,应该是当前虚拟机特定值。Graphics是一个抽象类。g是抽象类引用,可以在该方法里面直接调用该引用以及其方法。系统会适当的时候将g指向具体类对象(可以用debug看到)。该类也实现了父类的抽象方法。多态。

repaint方法首先调用update方法,然后update方法调用paint方法。 

sun.java2d.SunGraphics2D

paint(Graphics g)  这个 Graphics 对象来自对应的控件,控件的Graphics 对象可以通过 getGraphics 方法获得,在 update 事件调用各个控件的 update 方法时,会把控件的 Graphics 对象作为参数传进去,之后 update 方法又调用 paint 方法,将该 Graphics 对象继续传递过去,就是这样的过程

52.    类的访问权限区别:

对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。

内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。

         当一个内部类使用了private修饰后,只能在该类的外部类内部使用。

53.    为什么要使用双缓冲技术,应为刷新频率太快,一次paint方法还没来的及完全处理。

双缓存:将所有东西一次画在虚拟平面上,一次性显示出来。

54.    fillRect drawRect两者区别是前者用当前画笔颜色填充,后者不填充。

55.    public static final intGAME_WIDTH;常量定义

56.    switch操作仅能对int、short、char、enum和byte进行操作。其中枚举类型中的常量默认加前缀public static final。另外需要注意case后面直接加枚举值,不要“类名.枚举值”。枚举值用在其他地方要用到“类名.枚举值”。

57.    this(arg0,arg1,arg2……)的一个用法就是在构造函数中调用参数个数等于this的参数个数相同的构造函数。

58.    return:放在try catch语句块里面的return,不会对finally产生影响。也就是说finally块里面的语句一定会执行。其它地方,一旦return后面的都不会在执行。

一般return语句用在一个方法体的最后,退出该方法并返回一个值。单独的语句用在方法体中间是,会产生编译错误,因为这使得有些语句执行不到了(C++中貌似不影响,编译器可以处理)。但是,可以通过把return语句嵌入某些语句(如if……else,while等)来使程序在未执行完方法中的所有语句是退出。

59.    static:

a)        静态方法只能调用静态方法;只能访问静态成员(只是针对某个类内部而言,可以new对象然后调用);解释1:静态方法本身不能直接调用非静态方法,但他可以new个对象,让对象来调用。解释2:不能通过this调用非静态方法和非静态成员。

b)        不能在静态方法中访问非静态成员变量和非静态方法;

c)        静态方法在编译器在编译时会为其和其变量分配内存空间,如果引用了一个非静态的变量,那么在非静态变量作用结束后,这个变量就会消失,那么为它分配的那块内存就成了无用内存,但却无法回收,这样就造成了内存泄露,这样显然不合理。所以java中规定,静态方法不能直接调用非静态的方法或属性。

d)        不能在静态方法中使用this、super关键字(this代表指向自己对象的引用,而静态方法是属于类的,不属于对象,类成功加载后,对象还不一定存在,也不知道this指的是哪一个对象);

e)        static final静态方法只能继承,不重写(Override);

60.    static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次         。静态代码块可以在类加载时初始化静态成员。

61.    非静态方法访问静态成员:

非静态方法访问静态成员的时候,规则比较简单。非静态成员的生命周期被静态成员生命周期包含,因此当非静态成员存在的时候,静态成员绝对存在。故非静态方法在任何时候都可以访问静态成员

62.    static 和 this势不两立。注意静态成员前面不能加this,没有具体执行某个对象。

63.    一个类中,如果你不写构造方法,JVM会帮你加载一个无参数的构造方法。如果自己写了构造方法,但是不是无参构造方法,那就要注意后续还有没有子类,如果有子类,子类中没有显式调用父类构造方法,虚拟机会自动调用父类无参数构造方法。这个时候因为你自己写了非无参构造方法,虚拟机不能帮你加载无参构造方法,就会报错。

64.    final修饰变量时,表示该变量一旦获得了初始值后就不可改变。

a)        对于final修饰的成员变量,由于成员变量的初始值可以被系统默认赋初值,也可以由构造器或者构造块赋初值,因此,一旦初始化后,就不能在普通方法中对成员变量重新赋值了。final成员变量必须显式初始化系统不会对其进行隐式的赋值。

b)        对于final修饰的局部变量,既可以在定义时也可以不在定义时指定默认值,后者情况可以在后面代码中指定初始值,但只能一次。

c)        对于final修饰的引用类型变量,final只保证这个引用所引用的地址不会改变,即一直引用同一对象,但这个对象完全可以发生改变。

d)        final修饰的方法不可被重写。

e)        final修饰的类不可有子类。

65.    即使不包括任何abstract 方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

66.    "MyEclipse生成javadoc时出错:编码GBK的不可映射字符"解决办法 :

         在VM options下面添加:  -encoding UTF-8 -charset UTF-8

         第一个utf-8 表示javadoc程序读取java源文件时候应该采用什么编码

         第二个utf-8 表示程序写html文件时采用的编码形式,并且会在html中加入如下标签。

67.    枚举类型的静态values方法是编译的时候编译器自动添加的方法。可以反编译看class文件。枚举类型只继承java.lang.Enum,没有实现其他任何接口。该方法返回一个枚举类型元素数组,数组顺序与枚举类型声明顺序一致。

68.    java.util.Random类可以产生随机数,例如intnextTnt(int n),该方法可以产生一个0到n(不包括n)的随机整数。

69.    内部类一般都声明为私有,声明为公有情况下,别的类中要new对象的时候,要new外部类().new内部类()。对于枚举类型的内部类,在别的类中可以这样产生枚举引用:“外部类名.枚举类型名  引用名”。

70.    java.awt.Window :Toolkit gettoolkit()返回窗体的工具包。

         java.awt.Toolkit :Image getImage(Stringfilename)获取本地图片。Image CreateImage(String filename)从内存中获取图片。

         java.awt.Graphics : drawImage(……)用画笔绘制图片于特定起点。

         Graphics g:画笔,图形上下文。

         repaint——》update——》paint(Graphicsg)

71.    拿取硬盘信息的时候,不同的操作系统,不同的分区文件,拿到的硬盘信息都是不一样的。拿取硬盘信息只能通过本地操作系统的api去拿取,想通过java直接去拿取是拿不到的。通过toolkit可以去访问一些个比较适合操作系统做的事。一个桥梁作用。

         不同的操作系统toolkit可能是不一样的。

         可以怎么拿到当前操作系统toolkit?toolkit类有一个静态方法:getDefaultTookit();

72.    相对路径:相对于当前class文件所在的目录,class文件一般封装在包类,所以即相对于最顶层的包的路径。

73.    类名.class .getClassLoader().getResource("文件路径");可以拿到一个url,也就是该文件路径的url。getResource方法查找具有给定名称的资源。

gerResourceAsStream:返回读取指定资源的输入流。

74.    class对象和实例对象是两个不同的概念,java中把这一概念给弄混了。生成class对象和生成实例(instance)对象都有多种方法。首先要生成class对象,然后才能生成instance对象。

         Class对象生成方式:

a)        Class.forName(“类名字符串”)  类名字符串必须是全称 包名+类名

b)        实例对象.getClass()    位于Object类中的方法

c)        类名.class  本身就是一个Class对象, 代码中的意思就是拿到类加载器中的Class对象。

d)        原始包装类(Boolean,Byte,Integer,Double,Float,Long,Character,Short,Void)的static TYPE属性。  8个基本类型和void类对象由虚拟机创建。[f1] 

75.    一个.class文件对于类装载器本身就是一个Class对象。Class类是对.class文件的封装类。Class类中拥有.class文件所共有的方法的集成。

76.    Void  是个类,void是预定义的Class对象(伪类型)。

77.    静态代码区。初始化编变量。

78.    Properties pros = newProperties();然后要用该对象load方法加载指定资源输入流;接着就可以调用Properties中的其他方法eg:getProperty(String key),主要其返回值是String类型。

.properties格式文件中key=值 ,等号两端无空格,上下两行无分号。

79.    单例模式:内存中只有某个类的一个对象。(实现1:static对象。用static代码块初始化,静态文件类加载的时候加载到内存,虚拟机退出的时候清理,一直存在于内存)

单例模式的五种写法:懒汉、恶汉、静态内部类、枚举、双重校验锁。

80.    构造方法私有,不能new对象调用方法,只有静态方法的时候可以写一个无参无具体代码块的构造方法,使静态方法只能静态调用。

81.    If(false == bool)   false写在前面为了再少些一个“=”时候,编译器能自动检测出来。

82.    Socket  ServerSocket针对于TCP而言,UDP不说Socket,端口号65536个, 2的16次方吧,自定定义端口号1024以上的,1024一下的系统可能随时征用。UDP也有65536个端口。TCP和UDP端口是不同的,两个可以同时是8888。getOutputStream 、getInputStream。

83.    TCP:客户端Socket(host,port#)  服务器端:ServerSocket s(port#)  s.accept()等待连接。

Tcp有getIntputStream和getOutputStream,所以不用和ByteArrayOutputStream联系(udp与此有联系),因为不与“字节数组”有关,只和DataOutputStream联系。

84.    UDP:不区分客户端和服务器端,DatagramSocket  DatagramPacket

Server端:bytebuf[]=new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length);DatagramSocketds = new DatagramSocket(5678);  ds.receive(dp); new String(buf, 0 ,dp.getLength())

Client端:byte[] buf= (new String(“hello”)).getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,newInetSocketAddress(“127.0.0.1”,5678)); DatagramSocket ds = new DatagramSocket(9999); ds.send(dp);

注意:ByteArrayOutputStream  toByteArray()

85.    Socket s    s.close();关闭此套接字,同时关闭该套接字的OutputStream和InputStream流。关闭的时候注意用finally,if(s!=null){ s.close(); s = null}

86.    Java 中的“类名.this”:this一般指的是当前正在访问这段代码的对象。当在内部类中使用this指的就是内部类的对象;为了访问外层类对象,就可以使用类名.this来使用,一般也只在这种情况下使用。

87.    Panel不是顶层窗口,要放置在Frame或者Dialog中。

88.    The local variable XXX may nothave been initialized

局部变量如果不初始化,里面的就是一些垃圾值。如果你再方法里用到了,有可能造成运行错误,这种错误很难找到。

所以Java要求变量必须初始化,其中实例变量和类变量有默认的初始值

给变量一个初始化,是一个良好的编程习惯,而Java的编译器只不过做的极端一些,强制你养成良好的编程习惯。这个是有好处的

89.    Myeclipse中main函数参数可以从下步骤输入:右键—— run as——run configurations——Arguments

90.    增强的for循环:foreach

格式:for (循环变量类型 循环变量名称 : 要被遍历的对象循环体

eg:         for(Map.Entry<Integer,User>entry:g.getUsers().entrySet()){}

91.     


 [f1]9种预定义的Class对象只能通过这两种方式取得Class对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值