Java笔记

 

书本总是喜欢用冗长的代码来描述,不方便快速复习。所以摘下要点,方便复习。

 

 

 

一、基本语法以及操作符

 

 

 

 

二、访问权限

Public

private

    protect 子类可以访问父类受保护成员

 

不过不声明以上三种,就默认为default,

权限为在同一个包内可以访问。

 

不管是何种权限,在同一个类里面是都能访问到的。

也就是在类的实现里面都可以访问即使是已经实例化的对象。

 

 

三、复用类

1、  组合,在类里面使用其他的类。

2、  继承。

无法继承父类的private内容,也就是父类的private内容对子类不可见,但是若父类对其拥有一个public方法的调用,子类仍然可以通过调用此public方法使用父类private方法。

 

初始化顺序:

a 静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)

b 普通成员初始化

c 执行构造函数。

 

1 继承体系的所有静态成员初始化(先父类,后子类)

2 父类初始化完成(普通成员的初始化-->构造函数的调用)

3 子类初始化(普通成员-->构造函数)

 

类的加载,类只有被用到的时候才会被加载,且只初始化一次。

 

Super用来引用父类方法(仍旧无法访问private)。和显式的调用父类构造器

 

Java不允许多重继承,但使用了接口实现了多重继承

3、  多态

实现多态的途径之一就是向上转型。

就是子类,或者实现了一些接口的类,都可以使用父类或者那些接口去代替他本身的引用。

向上转型的时候,父类的接口是无法访问子类里新增的方法和属性的。

 

4、  接口,接口就是将声明和实现分割开来,使用interface修饰。

与之对应的是抽象类,其中一些方法使用Abstract,强制子类实现它的方法。

与之相关的是各种设计模式。

 

四、容器

 

l   Collection子接口之一:Set接口

  • Ø HashSet   LinkedHashSet   TreeSet

l   Collection子接口之二: List接口

  • Ø ArrayList  LinkedList  Vector

l   Map接口

  • Ø HashMap  TreeMap  Hashtable

 

 

集合支持遍历,需要继承Iterable的接口,并实现其next和hasNext方法。

TreeMap的排序需要继承comparable接口实现其compareto,或者实现一个comparator对象,为这个对象实现compare的方法。

 

当要在map中写入自己定义的类的时候,要重写这个类的equal方法和hasCode方法。

 

容器的具体方法参考文档。

五、异常

建议使用try catch的方法捕获异常

自己实现异常

手动抛出异常 throw

 

六、String类

String,StringBuffer与StringBuilder的区别

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String

StringBuffer

         StringBuilder都有append方法,可以直接增加字符串。

 

格式化字符串:

  1.         int x = 1;  
  2.         float y = 1.223f;  
  3.         System.out.printf("%d %f",x,y);  
  4.         System.out.println();  
  5.         System.out.format("%d %f",x,y); 

可以用Formatter在控制台完美的控制间隔,不用你自己去数几个空格了。

[java] view plaincopy

  1. public class TestString {  
  2.     public static void main(String[] args) {  
  3.         Formatter fm = new Formatter(System.out);  
  4.         fm.format("%-5s %5s %10s ", "Name","Age","School");  
  5.     }  
  6. }  

%数字+s这样的表达像c,位置可以移动。

 

[java] view plaincopy

  1. System.out.println(String.format("%h", 17));  
  2. nbsp;fm.format("%h", 17);  

16进制的格式化输出。

 

 

正则表达式:

      不用真心熟悉不起来,跳过。

 

 

 

 

七、类型信息

每一个类都对应着一个Class对象。

  • Ø 在运行时判断任意一个对象所属的类
  • Ø 在运行时构造任意一个类的对象
  • Ø 在运行时判断任意一个类所具有的成员变量和方法
  • Ø 在运行时调用任意一个对象的成员变量和方法
  • Ø 生成动态代理
  • Ø Class本身也是一个类
  • Ø Class 对象只能由系统建立对象
  • Ø 一个类在 JVM 中只会有一个Class实例
  • Ø 一个Class对象对应的是一个加载到JVM中的一个.class文件
  • Ø 每个类的实例都会记得自己是由哪个 Class 实例所生成
  • Ø 通过Class可以完整地得到一个类中的完整结构

方法名

功能说明

static Class  forName(String name)

返回指定类名 name 的 Class 对象

Object newInstance()

调用缺省构造函数,返回该Class对象的一个实例

getName()

返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称

Class getSuperClass()

返回当前Class对象的父类的Class对象

Class [] getInterfaces()

获取当前Class对象的接口

ClassLoader getClassLoader()

返回该类的类加载器

Class getSuperclass()

返回表示此Class所表示的实体的超类的Class

Constructor[] getConstructors()

返回一个包含某些Constructor对象的数组

Field[] getDeclaredFields()

返回Field对象的一个数组

Method getMethod(String name,Class  …  paramTypes)

返回一个Method对象,此对象的形参类型为paramType

 

 

 

实例化Class类对象(四种方法)

1)前提:若已知具体的类,通过类的class属性获取,该方法

                    最为安全可靠,程序性能最高

       实例:Class clazz = String.class;

2)前提:已知某个类的实例,调用该实例的getClass()方法获

                    取Class对象

       实例:Class clazz = “www.atguigu.com”.getClass();

3)前提:已知一个类的全类名,且该类在类路径下,可通过

       Class类的静态方法forName()获取,可能抛出ClassNotFoundException

       实例:Class clazz = Class.forName(“java.lang.String”);

4)其他方式(不做要求)

ClassLoader cl = this.getClass().getClassLoader();

Class clazz4 = cl.loadClass(“类的全类名”);

 

实现了动态代理:

         待补

 

 

 

 

八、泛型

Java泛型没有其它语言的泛型那么有用,原因之一就是使用了擦除。擦除的核心动机是使得泛型化与非泛型化的代码之间能互相调用,是为了兼容。Java的设计者认为这是唯一可靠行的解决方案。如果Jdk1.0就引入了泛型,则不会有这个问题。

 

Java的泛型因为历史的遗留问题,所以实行了擦除的原理。即所有类都在运行期间都将自动擦除成Object对象,丢失其原有的对象信息

 

 

泛型方法 : public<T> void f(T x){}

 

擦除。List<String>型的对象与List<Integer>型的对象,在运行时,其类型都被擦除为List。因此,在泛型机制下,无法获得有关泛型参数的运行时信息,像List<Integer>成为List,普通类型T则成为Object类型。这相比c++的模板机制,有很大的不足之处,弥补方法之一是使用泛型边界如<T extends ClassType>。

边界Java泛型编程中使用extends关键字指定泛型参数类型的上边界(重写了extends关键字,与继承没有什么关系)

 

Java泛型编程的边界可以是多个,使用如<T extends A & B & C>语法来声明,其中只能有一个是类,并且只能是extends后面的第一个为类,其他的均只能为接口

泛型通配符:

 

 

 

有个古怪循环,没搞懂什么意思,好像什么子类限定,自己限定自己子类的泛型?

以后再研究。

 

九、并发

Executor 懒得补以后写。

 

你可能感兴趣的:(Java笔记)