一、Java入门
1.1 Java的特点
1.11 面向对象
1.12 平台无关
Java语言提供的编译器不针对特定的操作系统和CPU芯片进行编译,而是针对Java虚拟机把Java源程序 编译 成 字节码 。
Java虚拟机负责 解释 运行字节码,翻译成虚拟机所在平台的 机器码 。
1.13 多线程
1.14 动态
Java程序的 基本组成单元 是类。
Java中类是运行时 动态装载的 。
1.2 Java开发的步骤
1.21 编写源文件
1.22 编译源文件
- 使用Java编译器( javac.exe)编译源文件 , 得到字节码文件 (.class文件)。
- 如果源文件中包含 多个类 ,编译源文件将 生产多个扩展名为.class的文件
- 格式: javac 文件名.java
1.22 运行程序
- 使用Java SE平台中的Java解释器 (java.exe)来解释执行字节码文件。
- 含有public static void main(String args[])方法的类,称这个类为是 主类 。
- 当Java应用程序中有多个类时, Java解释器执行的类名必须是主类的名字 ( 不用加扩展名 )
- 格式: java 主类名
1.23 文件命名规则
- 如果源文件中有多个类,那么 只能有一个类是public类;
- 如果有一个public类,那么 源文件的名字必须与这个类的名字完全相同;
- 如果源文件没有public类,那么源文件的名字可以是任意合法标识符(建议与某个类的名字相同),并且扩展名是java就可以了。
二、基本数据类型与数组
2.1 标识符与关键字
2.11 Java标识符定义
- 包名、类名、方法名、参数名、变量名等,这些符号被称为标识符。
- 标识符可以由 字母、数字、下划线(_)、美元符($)组成 ,但不能包含@、%、空格等其它特殊字符, 不能以数字开头。
2.12 Java标识符规则
- 包:全部小写。如果是多级包,用.分开。 举例:itcast,cn.itcast,com.baidu,cn.itcast.test
- 类和接口(见名知意, 驼峰命名 ):一个单词时首字母大写。由多个单词组成,每个单词的首字母大写。 举例:HelloWorld,HaoGuiBao
- 方法和变量:一个单词时首字母小写。如果是多个单词组成,从第二个单词开始,每个单词的首字母大写。
- 常量:如果是一个单词,全部大写,举例:PI。 如果是多个单词,全部大写,并用_隔开, 举例: STUDENT_MAX_AGE
2.2 数据类型
2.21 Java的基本类型
2.22 Java中的常量
- 十六进制整型常量:以十六进制表示时,需以0x或0X开头,如0xff,0X9A。
- 八进制整型常量:八进制必须以0开头,如0123,034。
- 长整型:长整型必须以L作结尾,如9L,342L。
- 浮点数常量:由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。
- 字符常量:字符型常量需用两个单引号括起来(注意字符串常量是用两个双引号括起来)。
2.23 数据类型之间的转换
- 自动转换 :当一个较”小”数据与一个较”大”的数据一起运算时,系统将自动将”小”数据转换成”大”数据,再进行运算。这些类型由”小”到”大”分别为 (byte,short,char)–int–long–float—double。
- 强制转换 :将”大”数据转换为”小”数据时,你可以使用强制类型转换。 所有的byte,short,char型的值将被提升为int型。
- 包装类过渡类型转换:在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。
- 字符串与其它类型间的转换 :
- 1)其它类型向字符串的转换:
- ①调用类的串转换方法:X.toString();
- ②自动转换:X+””;
- ③使用String的方法:String.volueOf(X);
- 2)字符串作为值,向其它类型的转换:
- ①先转换成相应的封装器实例,再调用对应的方法转换成其它类型;
- 例如,字符中”32.1″转换double型的值的格式为:new Float(“32.1”).doubleValue()。也可以用:Double.valueOf(“32.1”).doubleValue()
- ②静态parseXXX方法
- String s = “1”;
- byte b = Byte.parseByte( s );
2.3 Java输入输出语句
- 使用java.util包。 import java.util.*;
- 构造Scanner类对象,它附属于标准输入流System.in, Scanner s = new Scanner(System.in);
- 常用的next()方法系列: nextInt():输入整数 nextLine():输入字符串 nextDouble():输入双精度数 next():输入字符串(以空格作为分隔符)。
2.4 数组声明、初始化、引用
- 声明数组 : 特别注意 int [] a,b[];等价于int a[],b[][];
- 为数组分配元素 : 特别注意 和C语言不同Java允许使用int型变量的值指定数组元素的个数;
- length的使用:对于一维数组,“数组名.length”的值就是数组中元素的个数;对于二维数组“数组名.length”的值是它含有的一维数组的个数
- 数组的引用:特别注意 对于char型数组a,System.out.println(a)不会输出数组a的引用而是输出数组a的全部元素的值;如果想要输出char型数组的引用,必须让数组a和字符串做加法运算,如System.out.println(“”+a);
三、类与面向对象
3.1 类体的内容由两部分组成
- 一部分是 变量的声明;
- 另一部分是 方法的定义;
3.2 成员变量和局部变量的区别
- 在类中的位置不同
- 成员变量:类中方法外
- 局部变量:方法定义中或者方法声明上
- 在内存中的位置不同
- 成员变量:在堆中(成员变量是对象的一部分)
- 局部变量:在栈中
- 生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
- 始化值不同
- 成员变量:有默认值
- 局部变量:没有默认值,必须定义,赋值,然后才能使用
- 访问控制修饰符不同
- 局部变量不能被访问控制修饰符和static所修饰
3.3 构造方法与一般方法的区别
- 构造方法是在对象建立时给对象初始化,一般方法是对象建立后,当对象调用该功能时才会执行。
- 普通方法可以使用对象多次调用,构造方法就在创建对象时调用。
- 构造方法的方法名要与类名一样,而普通的方法只要符合标识符的命名规则即可。
- 构造方法没有返回值类型。
3.4 构造代码块
- 构造代码块 :直接在类体中定义且没有加static关键字的代码块{}称为构造代码块。
- 构造代码块作用 :给所有的对象进行统一的初始化。构造代码块是在对象创建时就被运行,并且在构造方法之前运行。
3.5 形参与实参
形参就是方法声明时包含的参数声明,而实参则是调用方法时,实际传给形参的参数值。
3.6 实例成员和类成员
成员变量可分为实例变量和类变量
3.61 实例变量和类变量的区别
- 所有对象共享类变量 :类中的变量,在该类被加载到内存时,就分配了相应的内存空间;
- 通过类名可直接访问类变量 ;
3.62 实例方法和类方法的区别(static方法就是没有this的方法)
- 对象调用实例方法 :当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址;实例方法中也可以操作类变量。
- 类名调用类方法 :类方法不可以操作实例变量,这是因为在类创建对象之前,实例成员变量还没有分配内存。
- 静态初始化块 : 静态初始化块只调用一次 ,是在类被第一次加载到内存时,并非要创建对象才执行。
3.7 方法重载
- 方法名称必须相同,参数列表必须不同。
- 声明为static的方法不能被重载。
- 声明为final的方法不能被重载。
说明:当方法调用时,如果没有找到匹配的数据类型,那么会隐式地将一个类型 提升 到另一个类型。基本数据类型的层级关系如图1所示。
3.8 this关键字
- this可以出现在实例方法和构造方法中,但不可以出现在类方法中;
- this关键字出现在类的构造方法中时, 代表使用该构造方法所创建的对象 。
3.9 访问权限
四、子类与继承
4.1 继承的限制
- 一个子类只能够 继承一个 父类,但可以使用 多层继承 。
- 子类继承的时候,对于所有的非私有操作属于 显式继承 ,而所有的私有操作属于 隐式继承 (通过父类方法间接的进行操作)
- 如果要实例化子类对象,会默认 先调用父类构造 ,为父类之中的属性初始化,之后再调用子类构造。
4.2 方法重写
- 子类覆盖父类的方法遵循的是“ 两同两小一大 ”原则。
- 两同指的是 方法名和形参列表相同 。
- 两小指的是子类方法的 返回值类型 要小于或等于父类被覆盖方法的返回值,子类方法声明抛出的 异常类型 应比父类方法抛出的异常要小或相等。
- 一大指的是子类方法的 访问权限 应该比父类方法要大或相等。
- 要注意的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法,否则会报编译错误。
4.3 super关键字
- 当用子类的构造方法创建一个对象时,子类的构造方法总是 先调用 父类的某个构造方法;
- 当子类的构造方法没有明确地指明使用父类的哪个构造方法,那么子类就 默认 调用父类中不带参数 的构造方法 ;
- 当子类构造方法中有 super() 关键字 ,而且父类中没有无参数构造方法,却有一个或多个有参数构造方法时,是错误的;
4.3 final关键字
- 用final修改的变量就是常量, 不能改变 。
- 用final修饰方法后,该方法在子类中将 无法重写,只能继承。
- 用final修饰类后, 该类不能被继承。
4.4 对象的上转型对象
- 定义:如果A是B的父类,A a;a = new B();则称A类对象a是子类B对象b的上转型对象。
- 性质:上转型对象 可以操作子类继承或隐藏的成员变量,也可以使用子类继承的或重写的方法 。而不会是新增的方法,也不是父类原有的方法。
4.5 abstract类和方法
- abstract类可以有abstract方法也可以没有,但是抽象方法一定在抽象类中。
- abstract方法只允许声明,不予许实现(没有方法体), 子类必须要实现abstract方法。
- 抽象关键字 abstract 不可以和以下关键字共存:private、final、static
五、接口与实现
5.1 接口的意义及定义
- 接口的定义:由接口声明和接口体两部分组成,格式: [public] interface 接口名
- 接口体包含成员变量和方法: 成员变量实际是常量 ,都默认public static final; 接口中的方法的都是抽象方法 ,都默认是public abstract。
- 接口的实现: 关键字implements来声明 ,一个类可以同时 实现一个或多个接口 ,类体中 必须实现 这些接口中的 所有抽象方法。
- 重写接口中的方法: 重写方法 的访问权限一定要用 public来修饰。
5.2 接口回调
- 接口变量 :接口声明的变量
- 接口回调 :把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。
- 接口回调类似于 上转型对象调用子类重写的方法。
5.3 接口与抽象类的比较
区别:
- 抽象类中的abstract方法 可有可无 ,接口 只能 包含abstract方法;
- 一个类只能继承 一个 直接父类,却可以实现 多个 接口;
- 抽象类为继承体系中的 共性内容 ,接口为继承体系中的 扩展功能 ;
- 接口 只有常量 ,抽象类可以 有常量和变量 。
相同:
- 都位于继承的顶端,用于被其他类实现或继承;
- 都不能直接实例化对象;
- 都可以包含抽象方法,其实现类 必须重写这些抽象方法 。
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
咱们下期见。