java语言发展史:1.0(96年)->1.1(97年)->1.2(98年)->1.3(00年)->(02年)->5.0重大更新(04年)->6.0(06年)->7.0(11年)->8.0(14年)->9.0(17年)->10.0(18年.3月)->11.0(18年.9月)
常量:在运行过程中不能修改的变量,null不能直接输出
标识符:不能以数字开头。由数字,字母下划线和美元符号$组成
java基本类型字节数
byte 1字节;boolean 1字节;short 2字节;char 2字节;int 4字节;float 4字节;long 8字节;double 8字节;
自动类型转换:变量=变量;根据在内存中占用字节的多少,占用字节少的数据类型赋值给占用字节多的类型时
强制类型转换:变量=(需要转换为的类型)变量
字符的“+”操作:对于字符使用+操作是使用字符的ASCII码值进行相加的(A=65,a=97)
自动类型提升:当算术表达式当中包含多种数据类型时,整个表达式的类型自动提升到字节数最大的类型
+=:隐含了强制类型转换操作 shrot a = 10; a +=20; a = a+20等价于a = (short)(a+20);因为默认的类型是int,20是int类型
字符串+操作:当+操作中出现字符串时是连接操作
^: 相同为False,不同为True
短路与&&:如果左侧为False,结果肯定为False,后面的就不在执行
短路或||:如果左侧为True,结果肯定为True,后面的就不在执行
栈:栈中存放局部变量,运行完删除
堆:堆中存放new出来的空间,由垃圾回收器管理
重载
- 方法名相同,参数个数或者参数类型不同
- 与访问控制符、修饰符、返回值类型无关
重写
- 当子类需要和父类完全一样的声明方法时(父类和子类之间),修饰符要大于等于父类,同为静态或者非静态。
字符串
- 通过new关键字创建的多个字符串,即使内容相同,地址也不相同
- 直接赋值创建的字符串,若内容相同则地址相同
ArrayList
- 可调整大小的数组实现。
- remove(Object)删除指定的元素,返回是否删除成功
- remove(index)删除指定索引的元素,返回删除的元素
- get(index)返回指定索引处的元素;size()返回集合中元素的个数
构造方法:子类所有的构造方法都会在调用之前先调用父类的无参构造方法,即super(),super()是每一个子类构造方法的第一句
package:带包编译javac -d . HelloWorld.java
权限修饰符
- public>protected>默认>private
- 同一个包下的类和子类:可以访问public,protected,默认三种权限修饰的方法,变量
- 不同包下的类和子类:子类可以访问父类public,protected修饰的方法和变量,非子类仅可以访问public修饰的方法和变量
状态修饰符
- final修饰的基本类型的数据值是常量不可以变
- final修饰引用变量时,地址值不能变,引用变量里的内容可以发生改变
static:静态的意思;通过static修饰的成员变量,其值可以被所有对象共享。可以通过对象.name访问,但是建议通过类名.name访问
static访问权限
- static修饰的方法只能访问static修饰的成员变量和方法
- 非static修饰的方法可以访问static和非static修饰的方法和变量
多态
- 多态的前提和体现(有继承/实现关系,有方法重写,有父类引用指向子类对象)
- 在多态时父类引用只能访问父类中声明的变量和方法。将父类引用强制转换成子类时可以访问父类和子类的变量和方法
多态中成员访问特点
- 成员变量(编译看左边,执行实际调用看左边)
- 成员方法(编译看左边,执行实际调用看右边)
- 成员变量和方法访问不一样是因为,成员方法存在重写
多态优缺点
- 优点->提高了程序的扩展性(方法定义时使用父类作为形参,可以将所有的子类作为实参,方法内访问对象的方法时可以访问子类的方法)
- 缺点->:不能使用子类特有的成员方法(由于使用父类作为参数,在调用时只能调用父类中定义且被子类重写的方法)
多态类型转换
- 向上转型 (父类 变量名 = new 子类();)
- 向下转型:((子类类名)父类引用)
抽象类
- 没有具体实现的方法应该定义为抽象方法;
- 抽象类可以没有抽象方法,拥有抽象方法的类必须定义为抽象类;
- 抽象类通过多态进行实例化;
接口
- 没有构造方法,所有的类默认继承Object类
- 一个类可以实现多个接口,接口之间可以单继承和多继承
- 不能有非抽象方法,所有方法默认使用public abstract修饰
- 只有常量没有变量,变量默认使用static final修饰,可以使用类名访问
java 8 在接口加入默认方法,主要用于接口升级
- public default 返回值 方法名(){方法体}
- 重写接口中的默认方法时,不可以加default关键字
java 9 在接口中加入静态方法和私有方法
- public static 返回值 方法名(){方法体}
- 静态方法只能有接口名调用,接口的实现类是不可以调用的。
- private 返回值 方法名(){方法体}
- private static 返回值 方法名(){方法体}
- 私有方法可以把相同的代码提取出来进行封装,供其他函数调用,同时又不希望实现类调用
抽象类是对事物的抽象包括属性和方法,接口是对行为的抽象不包括属性只有常量
内部类
- 内部类可以直接访问外部类的成员,包括私有
- 外部类必须创建内部类对象才可以访问其成员
进程
线程是进程中的单个顺序控制流,是一条执行路径
- 单线程:一个进程如果只有一条执行路径,则称为单线程程序
- 多线程:一个进程如果有多条执行路径,则称为多线程程序
- run()方法封装线程执行的代码,直接调用,相当于普通的调用
- start()启动线程;然后又JVM调用此线程的run()方法
- setName(String name):将线程的名称设置为name
- getNmae():获得线程的名称
- join() 调用该方法的线程执行完毕后其他线程才能开始执行
多线程的两种方法
- 继承Threadlei
- 实现Runnable接口,将创建的对象作为Thread类构造方法的参数
多线程安全问题原因
- 是多线程环境
- 有共享数据
- 操作共享数据需要多条语句
- 解决办法是破坏三个条件的任意一个
反射获取Class类对象的方式
- 字节码文件未加载阶段:Class.forName(全类名) 多用于配置文件
- 字节码文件已加载阶段:类名.class 用于参数传递
- 对象已经在内存中创建阶段:对象.getClass() 用于获取对象的字节码
- 同一个字节码文件(.class),再一次程序运行中只加载一次,使用三种方法创建的是同一个对象
反射成员变量常用方法
- getFields() 获取public修饰的成员变量
- 属性.get(对象) 获取属性值
- 属性.set(对象,属性值) 为属性设置值
- getDeclaredFields() 获取所有成员变量不考虑修饰符
- 属性.setAccessible(true) 忽略修饰符检测
反射构造方法
- 类对象.getConstruct(属性类型...)
- 构造器.newInstance(属性类型)
反射成员方法
- getMethods(方法名) 获取公共方法,包括继承来的
- getDeclaredMethods() 获取公共和私有的,不包含继承的方法
- 方法名.invoke(对象名,参数值)