文章目录
前言
学习Java一段时间了,一直没有复习。接下来的几天时间就借着写博客复习一下JavaSE的知识。
一、Java初识
1.Java是什么
Java是一种基于C++诞生的面向对象的编程语言。
2.Java发展历史
1995年,Sun公司发布Java语言,并公开其
源码。
1998年,Sun发布JDK1.2,并将Java分为J2ME, J2SE, J2EE三部分。
2002年,Sun发布JDK1.4,此后Java语言在企业应用开发领域发展迅速。
2004年,Sun发布JDK1.5,同时更名为Java EE 和Java SE。
2009年,Sun被Oracle收购。
3.Java运行机制
Java程序要经过先编译、后解释的过程。
编译型语言:简单来说,就是将写好的程序一次性编译成机器码(机器可识别的语言),然后由机器执行程序。因其一次性编译成的机器码只适应于特定平台,所以跨平台时至少需要对程序进行重新编译。
解释型语言:由专门的解释器将程序逐行解释为机器码并立即执行。因其每次执行都需要将源码进行解释一遍,所以执行效率较低。
Java程序先经过javac工具编译成JVM(Java虚拟机)可识别的字节码,然后由JVM解释执行。从而具有跨平台的特性,并提高了执行效率。
Java程序跨平台只需要移交编译形成的字节码,由不同平台的JVM对其解释执行。从而省去了重新编译的麻烦。
4.Java开发准备
下载JDK(JDK是Java标准开发包,包含了一系列开发Java程序用到的工具)。
设置PATH环境变量(在PATH环境变量中添加JDK中java和javac两个工具的地址,为Windows系统查找命令提供路径。
5.Java命名规则和规约
规则
1.命名只允许使用英文、数字和符号(_, $)。
2.数字不能开头。
3.不能包含空格。
规约
驼峰式命名。
二、面向对象的编程思想
1.理解面向对象和面向过程
面向过程:将程序按照执行顺序拆分为一步步的操作(即函数),通过依次调用函数来实现程序。
面向对象:将程序中涉及到的事物分类(即类),每个类下面都有相应的个体(即对象),每个对象都能实现一定的操作(方法)并具有一些性质(成员变量),通过不同类的对象相互合作来实现程序。
2.修饰符
权限修饰符
用来描述类成员的访问权限,包含public, [默认],protected,private四个修饰符,修饰一个类成员时最多只能出现一个。
public:公有,在任何位置均可访问(调用)。
[默认]:同包中的类或者子类可以访问(调用),代码形式为不写。
protected:只在子类中访问(调用)。
private:只在当前类中可访问(调用)。
特征修饰符
分别作用于不同的场景,可以出现多个或0个。
abstract:可修饰类和方法(除构造方法),表示其是抽象的,抽象类不能拥有实例(对象),抽象方法不能拥有方法体。
static:可修饰成员变量、方法、块和内部类,表示其是静态的(即属于类的),可通过类名.的方式来调用。
final:可修饰类、变量(包括成员变量和局部变量)和方法,表示其是最终的。final修饰的类不可被继承,final修饰的变量只能赋值一次且之后不可被更改,final修饰的方法不可被重写。
其余特征修饰符在本阶段较少见,此处不加以展开。
外部类的修饰符只有public, [默认], abstract, final!
3.类
类是一个模板,描述一类对象的行为和状态。
代码如下:[修饰符] class Person{}
抽象类:不能实例化对象,class关键字由abstract修饰。
代码如下:[权限修饰符] static class Person{}
枚举:被命名的常量的集合,语法上必须将其所有对象在类体第一行列出并对其成员变量赋值,其余如方法等和普通类相同。
public enum TestEnum{
Mon, Tus, Wed, Thu, Fri, Sat, Sun;
private int value;
private int getValue(){
return value;
}
}
4.接口
接口可以理解为是一种特殊的抽象类,其所有方法均为抽象方法,不允许出现有方法体的方法,也不允许有块(带{}的都不允许)。
通常用来定义规范,接口可以被抽象类和普通类实现(关键字implement),接口之间可以多继承。关键字interface.
接口中成员变量默认修饰符public static final,可以不写(程序会自动添上public static final),不可以改成其他的。方法修饰符默认public abstract,规则同上。
public interface Student{
public static final int value;
String name;
study();
eat();
public abstract sleep();
}
5.对象
方法
[修饰符] 返回值类型 方法名(参数){方法体}
实例方法
用来描述对像的行为,可通过对象调用,不可以通过类名调用。
代码如下:[修饰符] 返回值类型 方法名(){方法体}
方法名首单词首字母小写,后面的单词首字母大写。(驼峰式命名)
public class Person{
public int eat(){
return 0;
}
}
静态方法
用static修饰的方法,除可通过对象调用,还可以通过类名调用。(不推荐使用对象调用静态方法)
代码如下:[权限修饰符] static 返回值类型 方法名(){方法体}
public class Person{
public static int eat(){
return 0;
}
}
构造方法
又名构造器,通过new关键字调用,用来创建对象。
块
在构造方法之前执行,作用相当于构造方法的补充,没有名字,不可被调用,代码形式为{方法体}。
代码如下:[修饰符] 返回值类型 方法名(){方法体}
方法名必须与类名一致!
方法体可以为空。
不可被static, abstract, final修饰。(static表示该方法与对象无关,但是构造器总是关联着对象;abstract修饰使方法无法被调用,但是构造方法必须被调用才能产生对象;final修饰使子类无法重写该方法,但是构造方法无法被继承。)
public class Person{
private int age;
{
this.age = 18;
}
public int Person(){
}
}
主方法(main方法)
程序执行的入口,系统识别到了main方法后会逐行执行main方法的方法体,各个对象的配合也是在main方法中实现的。
public class Person{
public static void main(){}//修饰符和返回值类型不能变
}
成员变量
(不可被abstract修饰)
实例变量
描述对象所具有的性质,对于不同的对象其值往往不同(可以理解为对象的个人财产)。
类变量
被static修饰的成员变量,对于不同的对象其值往往相同(可以理解为对象的公有财产)。
局部变量
在方法内部定义的变量,不属于类成员,可被final修饰,表示其不可更改。
public class Person{
public int age;//实例变量
private static String name;//静态变量
}
6.方法重载
作用:同一个方法根据不同类型的参数执行不同操作。
规范:出现在同一个类中,方法名相同,参数不同,其余部分随意。
public class Person{
public void eat(){}
public int eat(int number){return 0;}
public String eat(String name){return "";}
}
7.内部类
关于内部类的知识在下面这篇文章深入分析。
https://blog.csdn.net/weixin_45843360/article/details/113878214
8.类和类的关系
继承
Java的继承通过extends关键字实现,被继承的类称为父类,实现继承的类称为子类,子类和父类之间是一般和特殊的关系。
子类会获得父类全部的成员变量、方法和内部类,不能获得构造器和块。实现形式:子类名 extends 父类名{类体}。子类可以通过super.的方式调用父类的成员变量和方法。
子类可以有自己的成员变量和方法。
多态
由于继承产生的现象,Java引用变量有两种不同的类型,一个是编译时类型,一个是运行时类型。如:(类A继承类B) B test = new A();,变量test的编译时类型是类B,运行时类型是类A。
方法的多态性:引用变量在编译阶段(写代码阶段)只能调用其编译时类型(类B)具有的方法,而在执行时系统会调用运行时类型的方法(类A的方法)。
成员变量并不具备多态性,执行时系统会调用编译时类型(类B)的成员变量。
聚合
类A的成员变量中有类B的对象。(无论类B是否被调用,类A的对象始终存在于类B中)
依赖
类A的方法用到了类B的对象。(只有在包含类A对象的方法被调用时,才会用到类A的对象)
9.方法重写
遵循“两同两小一大”,方法名相同、形参列表相同,返回值类型、抛出的异常类型小于父类的,访问权限大于父类的。
静态方法重写之后必须还是静态方法,实例方法重写后必须是实例方法!
10.this和super
this和super都是用来在特殊的场景代替对象出现来调用成员变量或方法,this代替的是当前类的对象,super代替的是当前类父类的对象。
public class Person{
//this和super出现在构造方法中时必须放在第一行,且不能同时出现
public Person(){
this();//调用了当前类的构造方法
……
}
public Person(int num){
super();//调用了父类的构造方法
……
}
public void eat(){
int a = 1;
}
public void eat(int num){
int a = this.eat;
return a;
}
}