java学习基础知识点
1 JDK, JRE, JVM 的区别。
jdk---- 开发工具(开发人员使用) jdk 的核心是API--开发人员使用的标准类库
jdk 中的 javac.exe: java 编译器,将 java源代码转换成字节码文件。
java.exe: java解释器,执行java程序的字节码文件
jre----运行时的环境
jvm---虚拟机(用户使用)
关联关系:(jdk 包含jre ,jer 包含 jvm )
2. bin ---该文件夹存放javac ,java ,AppletViewer (小程序查看器)等命令程序
db---该文件夹包含 Apache Derby(开源的嵌入式关系型数据库) 数据等开放资源
include----该文件夹存放与 C程序相关的头文件
jre------存放与java 运行环境相关的文件
lib----存放java 类库
3.Path---系统路径 ClassPath----类路径(编译和执行java程序时所用到的类库路径)
4.设置jdk 操作环境 计算机--我的电脑--属性---高级系统设置---环境变量---系统变量---选择 Path环境变量 --编辑 D:\java\jdk1.8.0_301\bin (变量值)
5. java小程序不再需要main( )方法,但必须有一个父类为 JApplet 或Applet 的类
小程序的主类必须是 public
6.java 应用程序源文件命名规则 扩展名必须是 .java 如果源文件有多个类,则最多只能有一个 public类,源文件的名字必须与这个 public类的名字相同
7. .DOS命令操作 win+R cmd回车
8.分支结构
switc--case if---else
计算成绩 if---else
switch--case (score/10 )
1,凡是可以使用 switch-caes 的结构 ,都可以转换为 if-else。反之,不成立。
2,我们写分支结构时,当发现既可以使用 switch-case (同时,switch中表达式的取值不太多),又可以使用 if-else时,我们优先选择使用 switch-case
循环结构 在某些条件满足的情况下,反复执行特定代码的功能
9循环语句的四个组成部分
初始化部分 for 循环是有限的
循环条件部分-----是boolean 型
循环体部分
迭代部分
说明 :通常情况下,循环结束都是因为2中循环条件返回false 了·
for (1 ; 2; 4) {
3 }
执行过程 1--2--3--4 --2--3--4--.....-2
9.1 switch后面使用的表达式可以是那些类型的
byte ,short char int 枚举类型变量 string类型
9.2 while 循环
初始化条件
while (循环条件--是boolean型 ) {
循环体;
迭代条件 ;
}
写while 循环千万不要丢了迭代条件,一旦丢了就可能导致死循环
写程序避免出现死循环
9.3 do...while循环
初始化条件
do {
循环体;
迭代条件;}
while(循环条件 );
嵌套循环
内层循环结构遍历一遍,只相当于外层循环执行了一次
10. 数据类型
整型 byte (字节型) short(短整型) int (整型) long(长整型)
浮点型 float (单精度浮点) double (双精度浮点)
布尔型 (boolean ) 逻辑性 ture false
字符型(char)
字符串 “abc" 不属于基本数据类型 属于引用数据类型 字符串使用双引号 ”abc" 字符使用单引号 ’a'
计算机在任何情况下都只识别二进制 eg.01010101111
1byte=8 bit 【1个字节=8个比特位】
11. 八种基本数据类型当中除布尔型之外剩下的七种类型都可以互相转换
自动类型转换 (小容量到大容量的转换)
byte<short<int<long<float<double 注:任何浮点类型不管占用多少个字节,都比整数型容量大
char和short 可表示的种类数量相同,但char可以取更大的正整数
强制类型转换 (大容量到小容量) 需要加强制类型转换符,从可以编译通过·,在运行阶段可能会损失精度,谨慎使用
12. 多种数据类型混合运算先转换成容量最大的在进行转换
### 12.1 byte ,short ,char 混合运算的时候,各自先转换成 int 类型再进行转换
## 13类与对象是面向对象的核心
对象是实际存在的该事物的每个个体,因此也称为实例 万事万物皆对象
13.1 .类:事物的描述 对象:类事物的具体个体
类(数据成员----属性 函数成员-----行为)
13.2 .修饰符
1)类修饰符
public ---公共类 可以被任何对象访问
abstract ---抽象类
final ---最终类 不是 继承类 不能被其他类所继承
缺省 ---缺省修饰符时,表示只有在相同包中的对象才能使用这样的类
eg. [ 类修饰符 ] class 类名称
注:一个类中可以有多个修饰符无顺序之分,但 abstract 和final 相互对立,不能同时应用在一个类里
2)成员变量修饰符 [ 修饰符] 变量类型 变量名 [=初值];
public ---公共访问控制符--被任何对象访问
private---私有访问控制符--在自己的类里访问
protected--保护访问控制符--被自己的类,子类同一包里的类访问
缺省---同一包中的其他类访问
final---最终修饰符--变量值不能修改
static---静态修饰符--所有对象共享
transient---修饰符--过渡修饰符
volatie---修饰符--易失修饰符
3)成员方法 [修饰符 ] 返回值数据类型 方法名(参数1,参数2,....)
{
语句序列; //方法的主体
return [ 表达式 ]; //方法的主体
}
注:如果不需要传递残数到方法中,只需将方法名后面的小括号写出即可,不必再填写任何内容,
另外,若方法没有返回值,则返回值的数据类型应为 void ,且 reture 语句可以省略
4)成员方法修饰符
public ---公共访问控制符--被任何对象访问
private---私有访问控制符--在自己的类里访问
protected--保护访问控制符--被自己的类,子类同一包里的类访问
缺省---同一包中的其他类访问
final---最终修饰符--变量值不能修改
static---静态修饰符--所有对象共享
abstract---抽象修饰符
synchronized--同步修饰符
native---同步修饰符
14.继承 extends
实际上子类继承父类之后,是将父类继承过来的方法归为自己所有。实际上调用的也不是父类的方法,是他子类自己的方法(因为已经继承过来了)
14.1.在实际开发中,满足什么条件的时候,可以使用继承
凡是采用“ is a"能描述的,都可以继承
eg. Cat is a Animal;
Dog is a Animal;
15.任何一个类,没有显示继承任何类 默认继承 Object ,那么Object 类中有哪些方法
16.当源代码当中一个方法以" ; "结尾,并且修饰符列表中有“ native "关键字,表示底层调用C++写的 dll程序 ( dll动态链接库文件)
17.System.out.println ("Hello World " ) ;
System.out 中,out 后面没有小括号,说明 out 是变量名
另外 System 是一个类名,直接使用 类名System.out 说明out 是一个静态变量
System.out. 返回一个对象,然后采用 ”对象. "的方式访问 println( ) 方法
18.toString 方法
System.out.println (引用);
当直接输出一个 “引用 ”的时候,println( ) 方法会先自动调用 “ 引用. toString( ) ",然后输出 toString( ) 方法的执行结果
方法覆盖必须满足下列条件
(1) 子类的方法的名称及参数必须和所覆盖的方法相同
(2) 子类的方法返回类型必须和所覆盖的方法相同
19重载方法必须满足下列条件
(1) 方法名必须相同
(2) 方法的参数签名必须相同
(3) 方法的返回类型和方法的修饰符可以不相同
20.方法覆盖
Overwrite Override 就是把继承过来的方法覆盖掉了,继承过来的方法没了
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,子类有权力对方法进行重新编写,有必要进行” 方法的覆盖 “ 方法覆盖 又叫 "方法重写 "
重要结论
当子类对父类继承过来的方法进行“方法覆盖”之后,当子类对象调用该方法的时候一定执行覆盖之后的方法
21当我们代码怎么编写的时候,在代码级别上构成了方法覆盖?
条件1:两个类必须要有继承关系
条件2 :重写之后的方法和之前的方法具有相同的返回值类型
相同的方法名
相同的形式参数列表
条件3:
访问权限不能更低,可以更高
条件4:重写之后的方法不能比之前的方法抛出更多的异常,可以更少
22方法覆盖注意事项
注意1:方法覆盖只针对方法,和属性无关
注意2:私有方法无法覆盖
注意3:构造方法不能被继承,所以构造方法也不能被覆盖
注意4:方法覆盖只针对实例方法,静态方法覆盖没有意义
方法覆盖和重写的时候建议将父类的仿佛复制粘贴,避免出错
继承有什么用?基本作用:代码复用 重要作用 :方法覆盖和多态机制
23方法重载 overload
什么条件满足之后能够构成方法重载
条件1 : 在同一个类当中
条件2:方法名相同
条件3:参数列表不同 (个数,顺序,类型)
23.1方法覆盖和·方法重载的区别
方法重载发生在同一个类当中
方法覆盖是发生在具有继承关系的父子类之间
方法重载 是一个类中,方法名相同,参数列表不同
方法覆盖 具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致,方法名一致参数列表一致,返回值类型一致
toString( ) 方法的作用:将“ java对象” 转换成字符串的形式
Object类中 toString( ) 方法的默认实现是什么:
public String toString( ) {
return getClass( ).getName( )+"@"+Integer.toHexString( hashCode( ) ); }
24 toString :方法名的意思是转换成 String
含义:调用一个java对象的toString( )方法就可以将该java 对象转换成字符串的表示形式
用父类的对象访问子类的成员
通过父类访问子类成员,只限于“覆盖”的情况发生时。也就是说,父类与子类的方法名称,参数个数与类型必须完全相同,才可通过父类的对象调用子类的方法
不可被继承的成员与最终类
在默认情况下,所有的成员变量和成员方法都可以被覆盖,如果父类的成员不希望被子类的成员所覆盖可以将它们声明为final
24.1 final 最终变量 可以访问,不能修改
修饰成员方法时 成员方法不能被子类所覆盖
对于比较重要且不希望被子类重写的方法可以使用final 修饰符对成员方法进行修改
凡是被声明为 final 的量均为常量,而常量无法在程序代码的任何地方再做修改
如果一个类被final 修饰符所修饰,则说明这个类不能再被其他类所继承
24.2private final 修饰方法时,这些方法不可能被子类继承与覆盖
一个成员变量若被 static final 两个修饰符所限定,它的实际含义就是常量 ,所以在程序中通常用 static 和 final 一起来指定一个常量,且这样的常量只能在定义时被赋值
Object 类 所有类的源
25多态的基础语法
1.学习多态基础语法之前,我们需要普及两个概念
第一个:向上转型 (upcasting ) 子-----父 (自动类型转换) Animal a=new Cat( );
第二个:向下转型 (downcasting ) 父-----子 (强制类型转换,需要加强制类型转换符)Cat=(Cat ) a
需要添加强制类型转换符
需要调用或者执行子类对象中特有的方法,必须进行向下转型,才可以调用
注意:
java中允许向上转型,也允许向下转型。无论是向上转型,还是向下转型,关系两种类型之间必须有继承,没有继承关系就没有向上向下转型 ,没有继承关系编译器报错。
2. 什么是多态
多种形态,多种状态
多态表示多种形态 编译的时候一种形态,运行的时候是另一种形态
多态指的是:父类型引用指向子类型对象,包括编译阶段和运行阶段
编译阶段:绑定父类的方法
运行阶段:动态绑定子类型对象的方法
java中只有“类名. ”或者“引用. "才能去” 点 "
eg. Animal a=new Cat( );
编译器只知道a的类型是Animal,所有编译器在检查语法的时候,会去Animal.class字节码文件中找move( )方法,找到了,绑定上move( )方法,编译通过,静态绑定成功。(编译阶段属于静态绑定)
再来分析运行阶段:
运行阶段的时候,实际上在堆内存中创建的java对象是cat 对象,所以move的时候,真正参与move的对象是一只猫,所以运行阶段会动态执行cat 对象的move( ) 方法,这个过程属于运行阶段绑定
( 运行阶段绑定属于动态绑定 )运行阶段自动调用堆内存中的真实对象
多态的典型代码:父类型的引用指向子类类型的对象
什么时候必须向下转型; 当访问的对象是子类特有的时候
类名.
引用.
运行时出现异常,这个异常和空指针异常一样非常重要,也非常经典
java.lang.ClassCastException; 类型转换异常 向下转换时易出现
java.lang.NullPointerException : 空指针异常,这个也非常重要
26运算符 Instanceof (运行阶段动态判断某个引用指向的对象是否为某一种类型)
第一:instanceof 可以在运行阶段判断引用指向的对象的类型
第二: instanceof 的语法:(引用 instanceof 类型)
第三: instanceof 运算符的运算结果只能是 ture / false
第四: c是一个引用,c变量保存了内存地址指向了堆中的对象
假设( c instanceof Cat )为ture 表示:c引用指向的堆内存中的java对象是 cat
假设( c instanceof Cat )为false表示:c引用指向的堆内存中的java对象不是 cat
向下转型时一定要运用instanceof 运算符进行判断
关于 instaneof 运算符的疑问
我们肉眼可以观察到底层到底是 new Bird( )还是 new Cat( ) ! ! 为什么还要进行instanceof 判断呐?
愿意是 你以后可能肉眼看不到 ,或者不是一个人编写的
26
使用 instanceof 时会判断该对象是否属于指定类或接口,同时也会判断是否属于其继承类或实现类。如果满足其中一个条件则返回值为 true,否则为 false。
使用 getClass() 方法进行判断时,由于 getClass() 方法返回值为当前实例对象的 Class 对象
抽象类
26.1 在抽象方法中不能定义方法体
以abstract 关键字开头,只声明返回值的数据类型,方法名称与所需要的参数,但没有方法体,
抽象方法只需声明,而不需实现,当一个方法为抽象方法时,意味着这个方法必须被子类的方法子类的方法所覆盖
注意:
由于抽象类是需要被继承的,所以 abstract 类不能用 final 来修饰,一个类不能既是抽象类,又是最终类
abstract 不能与 private, static ,final或native 并列修饰同一个方法
抽象类中不一定包含抽象方法,但包含抽象方法的类一定要声明为抽象类,用于派生子类,抽象类不能用new 运算符创建具体实例对象,必须通过覆盖方式来实现抽象类中的方法
软件开发七大原则中最基本的原则 OCP ----对扩展开放,对修改关闭
私有方法无法覆盖,方法覆盖只针对实例对象,静态方法覆盖没有意义 静态方法是属于类的,不属于任何独立的对象,其在编译时就被打包,也就是用哪个类的引用,就是调用哪个类的方法,所以不存在多态。
26.2
静态方法不可以被覆盖,静态方法不参与类对象而调用方法的覆盖机制。
私有不能覆盖,静最终类态不谈覆盖
最终类 final 修饰的东西都不能变
final 修饰的类无法被继承
final 修饰的方法无法覆盖
final 修饰的变量只能赋一次值
final 修饰的引用一旦指向某个对象,则不能再重新指向其他对象,但该引用指向的对象内部是可以修改的
final 修饰的实例变量必须手动初始化,不能采用系统默认值
final 修饰的实例变量一般和 static 联合使用,称为常量
public static final double P1=3.1415926535;
抽象类与接口以及抽象类和接口的区别
27.什么是抽象类
类与类之间具有共同的特征,将这些共同的特征提取出来,形成的就是抽象类,类本身是不存在的,所以抽象类无法创建对象 无法实例化
抽象类属于引用数据类型
抽象类怎样定义:
语法:在class前添加 abstract 关键字就行了
[ 修饰符列表 ] abstract class 类名 {
类体; }
抽象类是无法实例化的,无法创建对象,所以抽象类是用来被子类继承的
final 和 abstract 不能联合使用
抽象类的子类可以是抽象类也可以不是抽象类
抽象方法虽然无法实例化但是抽象类有构造方法,这个构造方法供子类使用
抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中
抽象方法怎样定义 :public abstract void doSome( );
一个非抽象类,继承抽象类,必须将抽象类中的抽象方法进行覆盖 / 重写 /实现
28接口
接口也是一种引用数据类型,编译之后也是一个class字节码文件
接口是完全抽象的,抽象类是半抽象的,接口是特殊的抽象类
接口怎样定义: [ 修饰符列表] interfactn接口名 { }
接口支持多继承,一个接口可以继承多个接口 eg. interfact C extends A, B{ }
接口中只包含两部分内容,一部分是常量,一部分是抽象方法
接口中所有的元素都是public 修饰的,都是公开的
接口中的抽象方法定义时,public ,abstract 修饰符可以省略
接口中的方法都是抽象方法,所以接口中的方法不能有方法体
接口中的常量 public static final可以省略
实现使用 implements 关键字来完成
当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖 /重写)
经过测试:接口和接口之间在进行强制类型转换时,没有继承,也可以强转,但是一定要注意运行时可能出现 ClassCastException 异常
接口的主要作用是帮助实现类似于类的多重继承机制,所谓多重继承机制,是指一个子类可以有一个以上的直接父类,该子类继承它所有父类的成员
29.访问控制
{ private 私有的 关键字是访问控制修饰词 可用于类,方法或字段
protected 受保护的 关键字是可以应用于类,方法或字段(在类中声明的变量)的访问控制修饰符
public 公众的 }所有类成员的默认访问范围都是 package 访问也就是说除非存在特定的访问控制修饰符,否则,可以从同一包中的任何类访问类成员
## 30.类 ,方法和变量修饰修饰符
abstract 声明抽象 关键字可以修改类或方法,可以扩展增加子类但不能直接实例化
class 类 用来声明新的java 类 该类是相关变量/或方法的集合
30
JDK(开发)自带JRE (运行)
JDK/bin :该目录下存放了许多命令,例如 javac.exe 和java.exe
javac.exe 负责编译 Java.exe 负责运行
将helloworld.java源程序通过javac 工具进行编译:
-首先需要解决的问题是:javac 命令是否可用
-打开DOS命令窗口,直接输入javac,然后回车,出现以下:
30.1问题:
'javac'不是内部或外部命令,也不是可运行的程序
或批处理文件
出现以上问题是因为:windows 操作系统无法找到 javac 命令文件
怎样解决以上javac不可用的问题?
windows 操作系统是如何搜索硬盘上的某个命令的?
首先从当前目录下搜索
如果当前搜索不到的话,会从环境变量path 指定的路径当中搜索某个命令
如果都搜索不到,则报以上的错误
path 环境变量和java语言没有关系,path 环境变量是属于windows操作系统的一个知识点。path环境变量是专门给windows 操作系统指路的
30.1
javac 命令怎么用?
javac java源文件的路径
什么是java源文件 Java源文件的名字是以“ ,java "结尾,该文件
java语言定义关键字