java的特性和优势:
简单性;面向对象;可移植性;高性能;分布式;动态性;多线程;安全性;
java的三大 版本:javase(标准版:桌面程序,控制台 开发.......),javaME(嵌入式开发:手机,小家电),javaEE(企业级开发:web端,服务器开发)。
jdk:java开发工具(jdk包含了jre,jvm),jre:java运行环境, jvm:java虚拟机。
java中有三种注释:单行注释(//),多行注释(/*....注释内容...*/),文档注释(/**...........*/)
基本类型:byte(默认值0,占1字节)、short(默认值0,占2字节)、int(默认值0,占4字节)、long(默认值0,占8字节)、float(默认值0.0,占4字节)、double(默认值0.0,占8字节)、char(默认值\u0000,占2字节)、boolean(默认值false)
引用类型:类(默认值null)、接口(默认值null)、数组(默认值null)
#转义字符:\t----制表符 \n -----换行
java变量是程序中最基本 的存储单元,其要素包括变量名,变量类型和作用域(类变量,局部变量(方法里),实例变量(类里边方法外边 ));
变量的命名规范:
#类成员变量:首字母小写和驼峰原则:monthSalary除了第一个单词以外,后面的单词首字母大写
#局部常量:首字母小写和驼峰原则
#常量:大写字母和下划线:MAX_VALUE
#类名:首字母大写和驼峰原则:Man,GoodMan
#方法名:首字母小写和驼峰原则:run(),runRun()
&&:逻辑与运算:两个都为真,结果才是true;
||:逻辑或运算:两个变量有一个为真,则结果才为true;
方法的重载规则:
#方法名称必须相同
#参数列表必须不同(个数不同,或类型不同,参数 排列顺序不同)
#方法上我返回类型可以相同也可以不相同
#仅仅返回类型不同不足以成为方法的重载
递归结构包含两个部分(自己调用自己,比较吃内存,用到栈):
#递归头:什么时候不调用自身方法,如果没有头,将会陷入死循环。
#递归体:什么时候需要调用自身方法
数组:相同类型数据的有序聚合,通过下标来进行访问。
java内存:堆(存放new的对象和数组,可以被所以有的线程共享,不会存放别的对象引用 ),栈(存放基本变量类型(会包含这个基本类型的具体数值),引用对象的变量),方法区(可以被所有线程共享,包含了所有的class和static变量)
#静态初始化:创建+赋值
int [ ] a={1,2,3,4,5};
#动态初始化:包含默认初始化
int [] a = new int [6]
a[0]=1;
a[2]= 2;
# 默认初始化
数组的四个基本特点:
#长度是确定的,数组一旦被创建,它的大小就是不可以改变的
#其元素必须是相同类型,不允许出现混合类型
#数组中的元素可以是任何数据类型,包括基本类型和引用类型
#数组变量属于引用类型,数组也可以看成是对象数组中的每一个元素都相当于对象的成员变量
#数组本身就是对象,java中的对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
ArrayIndexOutofBounds:数组下标越界
面向对象编程(OOP):以类的方式组织代码,以对象的组织(封装)数据;
面向对象三大特性:封装,多态,继承;
super注意点:
#super调用父类的构造方法,必须在构造方法的第一个;
#super必须只能出现在子类的方法或者构造方法中
#super和this不能同时调用构造方法
VS this:
代表的对象不同:
this:本身调用着这个对象
super:代表父类对象的引用
前提:
this:没有继承也可以使用
super:只能在继承的条件下才可以使用
构造方法:
this():本类的构造
super():父类的构造
重写:需要有继承关系,子类重写父类的方法!
#方法名必须相同
#参数列表必须相同
#修饰符:范围可以扩大但不可以缩小:public>protected>default>private
#抛出的异常:范围可以缩小但不能扩大
子类重写父类的方法,则执行子类的方法
重写,子类方法和父类方法必须要一致,只有方法体不同
对象能执行那些方法,主要看对象左边的类型,和右边关系不大;
为什么需要重写:
#父类的功能:子类不一定需要或者不一定满足
Alt+Insert:override
多态注意事项:
1.多态是方法的多态,属性是没有多态的
2.父类和子类,有联系,类型转换异常(ClassCastException)
3.存在条件:继承关系,方法需要重写,父类引用子类对象 :Father f1 = new Son();
不能进行多态的情况:static方法,被final修饰,private方法;
static代码块---》匿名代码块-----》构造方法
static只执行一次
有abstract修饰的类叫 抽象类,抽象类里边的抽象方法只有方法名字,没有方法实现
抽象类的特点:
#不能new这个抽象类,只能靠子类去实现它
#抽象类中可以写普通的方法
#抽象方法必须要在抽象类中
接口:interface关键字
每一个接口都要有相应的实现类impl
接口中的所有定义的方法其实都是抽象的 public abstrect
接口中可以定义常量,public static final
类可以实现接口通过implements关键字实现,实现了接口的类需要去重写接口中的方法
public class UserServiceImpl implements UserService{
};
内部类调用外部类的方法,属性;
一个java文件中可以有多个class类,但只能有一个public class类;
java创建对象的四种方式:
1.new
2.反射:
通过反射来生成对象有如下两种方式:
(1)使用Class对象的newInstance()方法来创建该Class对象对应类的实例。但是这种方式要求该Class对象的对应类有默认的构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
(2)先使用Class对象获取指定的Constructor对象,再调用Construtor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。
另外,如果我们不想利用默认构造器来创建java对象,而想利用指定的构造器来创建java对象,则需要利用Construtor对象,每个Construtor对应一个构造器,为了利用指定构造器来创建java对象,需要如下三个步骤:
(1)获取该Class对象;
(2)利用该Class对象的getConstrutor方法来获取指定的构造器;
(3)调用Construtor的newInstance方法来创建Java对象。
3.反序列化:这其中主要涉及到 Java 的 I/O 方面的内容,主要用到两个类 FileOutputStream 和 ObjectOutputStream , FileOutputStream 用于将字节输出到文件, ObjectOutputStream 通过调用 writeObject 方法将对象转换为可以写出到流的数据。所以整个流程是这样的: ObjectOutputStream 将要序列化的对象转换为某种数据,然后通过 FileOutputStream 连接某磁盘文件,再对象转化的数据转化为字节数据再将其写出到磁盘文件
4.clone:在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。 Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。