JAVA基础
这篇文章参考了一些视频以及菜鸟上的教程对java的一些基础知识进行总结。
第一部分先总结了java相关的基础语法、关键字、性质(封装、继承、多态)
后续会继续补充java的一些实现原理
Java运算符表格
Java基本语法
- 大小写写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
- 类名:类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
- 方法名:所有的方法名首字母小写。如果方法名含有若干单词,则后面的每个单词首字母大写。
- 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
javac -encoding UTF-8 HelloWorld.java java HelloWorld
- 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。
for, while 及 do…while、if、switch
&&与 || 或 ^(异或,异为1) !非
while
while( 布尔表达式 ) {
//循环内容
}
do … while
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次
do {
//代码语句
}while(布尔表达式)
for
for(初始化; 布尔表达式; 更新) {
//代码语句
}
if
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 switch case 语句语法格式如下:
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选(当所有case值都不匹配的时候,用default收尾)
//语句
}
变量(局部变量、类变量、实例变量)
java继承 extend 、 implements(final关键字)
extend
在类的声明中,通过关键字extends来创建一个类的子类。extends 是继承某个类, 继承之后可以使用父类的方法,也可以重写父类的方法;
extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
比如 class A extends B implements C,D,E
implements
一个类通过关键字implements声明自己使用一个或者多个接口。 implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用
finnal修饰类
finnal关键字代表 最终、不可改变
用finnal关键字修饰一个类的时候,这个类不能有子类,更别提覆盖重写了
finnal修饰方法
无论是在类还是函数中,finnal abstract 这种写法都是完全不对自相矛盾的
finnal修饰的方法不能进行覆盖重写
finnal修饰变量
finnal修饰局部变量,一次赋值,终生不变
finnal修饰的局部变量地址不变,地址名字可以改变
例如 finnal int num1=10;num1 =20 错误
可以 方法.getname
finnal修饰局部变量(必须要手动赋值:直接赋值或者用构造方法赋值)
一个继承的例子(定义类和对象,实现收发红包的操作)
API就是一本程序员随手使用的字典,除了自己编写类,JDK给我们提供了很多的类供我们调用。需要哪个类或者类中的方法,只要查查JDK API的官方文件,看看具体类中的方法使用 然后调用就好了
定义群主的类(继承user中的静态变量和构造方法)
在群主子类中写发红包的方法
用user写普通成员的子类
生成群主和成员的对象,开始发钱啦
多态与重写重载
多态是同一个接口,使用不同的实例而执行不同操作,当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态存在的三个必要条件:继承、重写、父类引用指向子类对象:Parent p = new Child();
方法的重写
也就是子类能够重写父类的方法。当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。要想调用父类中被重写的方法,则必须使用关键字 super。
重载优点好处:只需要记住一个方法的名称就可以实现类似的功能
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
多态的格式及使用(左父右子)
子类
父类
对象
抽象类
抽象的概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。 如果父类当中的方法不确定{}方法进行,那么这就应该是一个抽象方法
抽象类和抽象方法的定义
抽象类的使用
抽象类的注意事项
不能直接new抽象类的对象,必须用一个子类来继承抽象父类,并重写所有抽象方法(两个类,一个对象)
抽象类
这是错误的
继承后的抽象子类,这是正确的
对子类生成对象
访问控制修饰符
public>protected>(default)>privated
private:代表私有的,修来饰变量自只能在本类访问,private方法子类不能继承。
public:是最大权百限,都可以访问,是公共的度。
Java中定义一个属性 为什么要加private?加和不加的区别是什么?
java是面向对象语言,一切成员都会封装在一个类中,定义成抄private是为了更好地隐藏,对外暴露的是setter和getter方法,所以可以通过setter设置值,getter来取值,达到模块隐藏的目的。
JAVA中的protected
我们采取的最好的做法是保持成员的private状态——无论如何都应保留对基
础的实施细节进行修改的权利。在这一前提下,可通过protected方法允许类的继承者进行受到控制的访问:
private的作用,通过getter和setter来做一些限制,进而在实例中更好的描述数据
private的作用
private age之后,只有当前类可以使用age,在实例中无法直接调用age ,必须用setter和getter来访问或者设置age。
类的定义
实例
练习private的使用(特别boolean中getter是用isXxx)
实例
this
当局部变量与全局变量重名时,会采取就近原则,使用局部变脸,当想用类中的全局变量是加this,this.name
区分类中的三种变量—super(父类中方法)、this(本类中)、原名(局部)
super的使用范围
this的适用范围
方法定义及调用
方法的定义(JAVA中没有函数,只有方法)
方法的三种调用格式
对比有参数方法和无参数方法
对比有返回值和无返回值的方法
对于无返回值的只能进行单独调用
对于有返回值的能进行单独调用、打印调用、赋值调用
使用方法的注意事项的总结
类和对象(含义、组成、如何定义和创建)
类:抽象(定义属性和行为,相当于图纸)
对象:类的具体化,变成可操作性的实体
类的定义(成员变量、成员方法)
ps: 1、成员变量与其他变量不同,定义在方法外面
2、成员方法不写static关键字
根据类创建对象
在对象中使用类的成员变量(使用或者改变)—有默认值
在对象中使用类的成员方法
定义一个标准的类
创建类(有参数,无参数,getter和setter)
生成对象
线程
start作用(使两个线程并发执行)
如何创建一个线程
1、extend一个线程类,重写线程类中的run方法
2、创建线程类中的子类对象
3、调用thread中的start方法,实现线程并发
1、extend一个线程类,重写线程类中的run方法
2、创建线程类中的子类对象,调用thread中的start方法,实现线程并发
ps:主线程是靠main函数开启的
Thread类中的sleep方法(开一个线程,延迟时间-模拟时钟)
Thread类中的获取线程名称的方法
在类中重写run,定义出获取线程名称的操作(getName、currentThread)
创建一个子对象、进行输出
static关键字
在类中定义一个static关键字, 在对象中赋值之后,那么由此类生成的对象都共有static这个关键字,节省了内存空间
用static声明成员变量(静态变量)
student类,有name、age、和static room
这种情况下,两个对象都显示101教室
利用static进行idcounter
用static修饰成员方法(静态方法)
类中的静态方法不必要创建对象,直接类名:方法名
类中的成员方法必须要创建对象,调用对象中的方法才可以。
静态不能直接访问非静态
匿名对象
new 类名;只能使用一次
构造方法
注意事项
类定义(定义了一个无参一个有参的构造方法)
生成对象(利用了有参,无参,getter、setter)
内部类
内部类的定义
内部类的方法以及使用
内部类可以访问成员变量,以及外部方法
Random、System、Date类的使用
Random是一个JAVA的类,使用的话首先把包含这个类的package导入,然后把这个类导入,然后要记住——类必须新建对象才能用!!!!
得出带范围的Random
Data类的使用
System类
提供了大量系统级的操作或者获取系统相关的信息,比如说返回当前时间
获取以毫秒为单位的时间
接口
关于接口的详解
接口的格式
常量、抽象方法、默认方法、静态方法、私有方法
接口中定义抽象方法,所有版本都可以在接口中定义抽象方法(public abstract)
接口的使用步骤
定义一个类implement接口定义,并重写其中所有的抽象方法
创建该抽象类的对象
从Java8开始 接口中可以定义默认方法(为了解决更新接口的问题)
创建实现类对象,直接使用默认方法
接口中定义常量
访问接口中的常量(直接用方法.常量)