Java入门与环境搭建
java语言分类:j2se,j2me,j2ee,j2me->安卓
Java跨平台性:一次编译,处处运行。因为每个操作系统都有jvm,平衡了操作之间的差异,可以运行.class文件
垃圾回收机制使程序员无法精确控制和干预
Jdk和jre
Jdk:Java开发工具包
Jre:Java运行环境
Jdk中包含jre。Jdk中bin文件夹下都是java命令,例如javac,java命令
程序安装
建议安装目录不要有中文,空格,特殊字符(@,$),原因是当读文件的时候可能会发生转义找不到文件。例如空格会转义成
java环境变量的配置
JAVA_HOME,PATH
JAVA_HOME是java安装路径
PATH %JAVA_HOME%\bin
Path这样做的好处是,万一JAVA_HOME路径发生改变,JAVA_HOME不是必须配置的。在web时,会用到这个变量
上面的环境变量是针对某一用户的,下面的环境变量是针对系统的,系统有多少用户都可以使用
Java开发步骤
a) 编写.java文件
b) 把.java文件编译成.class文件
c) 运行.class文件java +文件名(不带后缀)
变量与运算符
合法标识符规则
由26个英文字母大小写,数字:0-9 ,_或 $ 组成
数字不可以开头。
不可以使用关键字和保留字,但能包含关键字和保留字。
Java中严格区分大小写,长度无限制。
标识符不能包含空格
Java中的名称命名规范
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
变量分类
成员变量,局部变量
数据类型
基本数据类型(8种)和引用数据类型(3种)
Byte short int long float double char blooen
数组 类 接口
数据类型转换,有小到大自动转,由大到小需强制
Boolean不能和其他转换
当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型
运算符
/:取整
%:取余
++,–运算
=和==
&&和||
三元运算符
顺序结构及条件结构
Scanner类
Scanner sc = new Scanner(System.in);
数据类型(引用数据类型,类类型) 变量名 = new +类名(System.in);
sc.nextInt()可以从控制台接收一个int类型的变量
sc.nextLine()可以从控制台接收一个String类型的变量
类的完整的名称:包名+类名
使用包的原因:防止有重名的类和方便类的管理
If语句
If可以没有else
If…else if…else,else if可以有多个else if后可以跟表达式
Switch语句:
a) switch里的表达式和case后的变量做比较,如果没找到合适的值,执行default语句
b) 2.找到合适的值,执行值对应的代码块。如果有break,则跳出。如果没有,继续往后执行
c) break不是必须的,案例见SwitchScore.java
d) switch表达式支持的数据类型:int, byte, char, short, 枚举, 字符串String
while do while
If(布尔类型表达式)语句else if(布尔类型表达式),boolean类型的表达式:if(true)一般表达式不会直接写true,false,而是一个变量,或者通过比较运算符组成的条件,eg:a>0或者多个比较运算符组成的条件:eg:a>=0 && a<=100
while(布尔类型表达式):while的表达式可以用true
switch(表达式):byte,short,int,char,enum,String
运行方式
如果是web项目,运行方式是run/debug on server
如果一个类带有main方法,是可以使用java application运行的
Run/debug:run可以直接运行出结果,debug可以关注中间过程。
如果想关注代码的中间过程,例如某一行代码的变量的内容,在这行左侧蓝色区域双击,会出现一个“点”,叫断点。有了断点后,可以用debug->java application运行代码。入口是main方法,从main方法开始执行,一直运行到打断点的行暂定。你可以观察中间过程,按F6,按行执行代码。按F8,跳转到下一个断点。如果想让程序一直执行到结束,可以双击断点,把断点去掉。按F8,直到程序结束。
点击java,回到java透视图
类和对象
成员变量 vs 局部变量
相同点:
a) 遵循变量声明或定义的格式: 数据类型 变量名 = 初始化值
成员变量,可以不初始化。如果不初始化,当创建对象的时候系统初始化。
局部变量必须显示的初始化
b) 都有作用域
成员变量作用域是类局部变量作用域是方法出了作用域,无法使用
不同点:
声明的位置的不同 :成员变量:声明在类里,方法外
局部变量:声明在方法内,方法的形参部分,代码块内
成员变量的修饰符有四个:public private protected 缺省(default),局部变量没有访问修饰符
Private类型成员变量,在本类中可以访问,当brand改为public权限,可以访问
类的结构
[< 修饰符>] class < 类名>
{
[<属性>]
[<构造构造方法>]
[<方法>]
}
[]表示可选
成员变量:
[<修饰符>] 类型 <属性名> [=初值] ;
变量必须先定义后使用
成员变量在对象创建的时候由系统初始化
方法:
<修饰符> <返回类型> <方法名>([< 参数表>]) {
[< 语句>]
}
对象的创建:
使用构造方法创建:类型(类名) 对象名 = new 类名()
通过对象调用成员变量或方法
对象成员变量有什么用?记录对象成员变量的信息,不同对象表现不同。
P1.name=”张三” p2.name=”李四”
Car1.color=”red”,car2.color=”blue”
参数传递
基本类型传值,对象类型传地址
封装
封装的好处:
隐藏对象的成员变量
成员变量的访问,通过get/set方法访问
读写可分离,通过设置访问权限
隐藏具体的实现细节
Get/set方法命名规范
get/set+成员变量
方法名符合命名规范
public int getAge(){
return age;
}
public void setAge(int param)
。。
}
类中成员变量访问权限一般设置成private,通过get,set方法访问
构造方法
生成对象,new+构造方法
初始化成员变量
构造方法名和类名相同,无返回值(对比普通方法定义)
如果类中没有定义构造方法,系统提供无参的构造方法。如果定义了,都不提供
Person2 p = new Person2();
Date d = new Date();
构造方法重载
方法名相同,参数列表(参数个数,参数类型)不同
构造方法初始化成员变量
可以使用this.成员变量名来访问。如果成员变量名和构造方法形参名一样,必须使用this.成员变量名访问
构造方法之间的调用
类有多个成员变量,,构造方法有重载。参数多的构造方法可以调用参数少的构造方法。可以使用this关键字调用参数少的方法。可以传参。This必须写在第一行
}
多态
表现:重载,重写
优点:重载:同一个名字多个方法可以使用。不用再起另外的名字
重写:子类对象可以表现为不同于父类的行为。通过声明为父类,定义为子类,少写很多代码
重载
在同一类中。在不同类中方法名相同,参数列表不同不构成方法重载 方法名相同 参数列表不同:参数个数,参数类型不同
系统会根据参数个数和类型自动匹配应该调用哪个方法
只根据方法的返回值,无法判断方法重载:方法虽然有返回值,但是可以不接收
java无法判断改掉用哪个方法
重写
重写:父类方法满足不了子类要求
返回类型相同
方法名相同
参数列表相同
访问权限:不小于父类方法
父类是default,子类可以是protected,public
重载和重写
重载针对同一个类中不同的方法,方法名相同,参数列表不同
重写:父类的方法满足不了子类要求,子类重写父类的方法,方法名,参数列表,返回类型都相同
Final关键字
Final修饰的类不能被继承,例如String
Final修饰的方法不能被重写:
Final修饰的基本数据类型变量,初始化不能被修改
Final修饰引用数据类型变量,地址不能被修改,即不能把一个其他变量赋值给它。
Static类型关键字
可以修饰变量,也可修饰方法
Static修饰变量,成为类变量。类变量中所有对象共享一套数据,类名.静态变量名
Static修饰方法:所有对象共享,类名.静态方法
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。
静态方法不能以任何方式引用this关键字。因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员。
随着类的加载而加载,只加载一次
类属性作为该类各个对象之间共享的变量。
抽象类和接口
抽象类
类可以定义为抽象类
有抽象方法的类都是抽象类
抽象方法应用场景:方法的实现没想好, 无法统一子类的实现,如果父类中有抽象方法,子类不实现,子类必须为抽象类
抽象类不能被实例化
抽象类不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法
a.属性:Abstract只能修饰类,方法。属性(成员变量)都有具体的值。
b.私有方法:如果能修饰,子类可以实现私有方法。私有方法只有本类能访问到,子类没有访问权限,既然不能访问就不能实现,子类必须定义为抽象类,子类继承类也必须是抽象类。子类中没有类能定义为非抽象类,无法用构造方法创建对象。
c. 构造方法:构造方法特点:和本类类名相同。构造方法在子类中不能被重写。如果能够修饰构造方法,构造方法在父类中只有声明,需要在子类中重写。所有不能修饰,矛盾
d. 静态方法:静态方法调用规则:类名.静态方法。如果能修饰,静态方法只能声明,不能有实现。矛盾
e. Final:final修饰的方法,不能被重写。如果用abstract修饰,目的是让子类实现这个方法。又不能被重写,又要求实现,矛盾
接口应用场景:
a).无法统一实现,即使实现了意义也不大1) 无法统一实现,即使实现了意义也不大
b) .软件实现流程,详细设计阶段。统一类功能,方法名,返回,参数等信息
接口的特点:
用 interface 来定义。
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
接口没有构造方法。
实现接口的类必须提供接口中所有方法的具体实现内容。
抽象类VS接口
相同点:
i. 接口和抽象类都不能被实例化。只能被其他类实现和继承。
ii. 接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类。
不同点:
iii. 抽象类与接口定义不同:抽象类abstract class ,接口 interface
iv. 接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。
v. 接口里不能定义静态方法;抽象类可以定义静态方法
vi. 接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量
vii. 接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。
viii. 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java的单继承不足
数组
数组是存储同一数据类型多个元素的集合,int a[],Person [] p
数组适用场景:集合,更适用于容器大小固定,不适用于对元素的增加,删除。
数组一旦初始化,长度不可变
一维数组声明
int a[];
int[] a1;
double b[];
Date[]c;
数组初始化
动态初始化:数据类型[] 数组名 = new 数据类型[数组长度];
静态初始化:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};,可以简写为:数据类型[] 数组名 ={元素1,元素2,…}
每个数组都有一个属性 length 指明它的长度
数组元素的引用方式:数组名[数组元素下标]
数组元素下标可以是整型常量或整型表达式
数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 至 n-1
数组的异常信息:
ArrayIndexOutOfBoundsException
NullPointerException
数组的应用
遍历,赋值,冒泡排序,传值和传址
二维数组
一维数组中每个元素又都是数组
二维数组访问,遍历,赋值
常用类
Object类
所有类的父类。Equals,toString方法默认实现。如果不满足子类需求,可以重写(多态)。
==和equals区别
String类
String不可变字符串。subString,trim,length,split
StringBuffer
可变字符串。字符串拼接频繁,次数较多。
Append
包装类
基本数据类型,只有int和char包装类特殊。
Integer.parseInt()把字符串转换成int类型
String.valueof()把数值型转换成String类型
Date & DateFormat 类
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
System.out.println(“使用sdf格式化:”+sdf.format(date));
反射
反射有什么好处 应用场景
动态编译,需要什么加载什么
只要知道类名,通过反射能知道类的所有内容。在修改成员变量值时,可以和业务无关
例如:Student,知道成员变量,set方法修改成员变量的值,通过反射,只要知道类名即可知道类的相关信息,通过某种方式set值即可
反射
操作类Class.forName(),数据库驱动加载
反射操作构造方法:
无参:获取类.newInstance
有参:获取构造方法 构造方法.newInstance
操作属性:获取类.getDeclaredField()
操作方法:类.getDeclaredMethod,method.invoke
Class c1 = Class.forName(“”);
() p = c1.newInstance();
Method m1 = c1.get(“”,返回类型.class)
M1.invoke(p,chuzhi)
关于面向对象以及三大特征的解释
https://blog.csdn.net/weixin_37766296/article/details/80316284
java知识点汇总
https://blog.csdn.net/weixin_37766296/article/details/80467341