在java中凡是可以由程序员自己命名的元素统一成为标识符。
-
包名称
-
类名称
-
属性名(变量名)
-
方法名
在java中一些用作于特殊用途的英文单词,称之为关键字,所有的关键字全部都是小写;goto和const还未被启动,所以在java中主要作为保留字存在。
java是一门强类型语言(区别于弱类型语言:javascript),所有的变量或者常量在声明时必须显式的指定数据类型,数据类型一旦定义则无法修改,java中包含两大类数据类型:
-
基本数据类型(简单类型)
-
整数型(byte-1字节、short-2字节、int-4字节、long-8字节)
-
浮点型(float-4字节、double-8字节)
-
字符型(char-2字节)
-
布尔型(boolean-1bits)
-
-
引用数据类型(复合类型)
-
类的引用
-
数组的引用
-
接口的引用
-
变量是java中用于描述数据的最基本单元,java中主要包含两种类型变量
-
成员变量(实例变量):一般定义在类中与方法同一个级别,使用范围为整个类的内部元素(普通方法,构造器,语句块);成员变量有默认值(具体值由数据类型决定)
-
局部变量:一般定义在方法内部,或者语句块内部,作用范围只能是定义区域以及其子区域(必须初始化)
构造器也叫构造方法,构造函数,构造器是一个特殊的方法,在java中对象的创建必须通过构造器完成,构造器的名称一般跟类名称保持一致(包括大小写),构造器没有任何的返回值类型(包括void),任何一个java类中都存在一个默认的无参构造器;构造器一般用于对成员变量初始化或者完成一些资源的开启操作等,例如:
public class Student{ String name; //构造器 public Student(String sname){ name = sname; } public static void main(String[] args){ Student s = new Student(); } }
一个类中可以存在多个构造器,但是每个构造器必须保证方法的参数个数,顺序,类型至少有一项不一致(方法的重载:overload)
循环语句
-
for循环
-
while循环
-
do...while循环
-
forEach循环(主要用于数组或者集合遍历操作,迭代)
-
递归(recursion)
打断循环:
-
continue:跳过循环语句中的一次循环
-
break:在循环语句中可以用于结束一层循环
-
return: 用于表示方法的结束,一旦执行到return,则方法结束;在同一个代码片段中return之后不允许执行任何其他代码
递归(Recursion)
递归即在方法内部调用方法自身,递归可以解决一些算法问题(斐波拉契数列等),文件夹遍历问题(目录树)、菜单树等结构,在java中递归有两种模式:
-
直接递归
-
间接递归
example::
使用递归解决斐波拉契数列
public int fib(int n){
if(n == 1 || n == 2){
return 1;
}else{
return fib(n - 1) + fib(n - 2);
}
}数组
数组是用于存储一组相同数据类型的数据结构,数组是一种引用数据类型。
数组的声明语法:
数据类型[] 变量名;
数组的初始化:
-
静态初始化
-
动态初始化
//数组静态初始化 int[] i = {1,3,5,7,9,11}; //数组的动态初始化 int[] j = new int[5];
数组中的元素获取方式通过索引,数组的索引从0开始;在获取数组中的元素时索引值是从0~(数组的长度-1)
数组的长度一旦定义无法改变
-
动态数组ArrayList
由于数组为定长数据结构,通常数组一旦定义,则长度无法修改,在实际使用中往往存在不够灵活的缺点;因此、在java中存在一种长度可变的动态数组:ArrayList,ArrayList类是基于可变长度数组的实现,底层实现原理依然是数组,内部通过数组拷贝的方式实现了数组的长度可变,ArrayList中提供了一系列用于操作数组中元素的方法,例如:
-
size() 获取ArrayList中元素的个数
-
add() 向ArrayList中添加新元素
-
get() 获取指定索引处的元素
-
remove() 删除指定索引处的元素
-
clear() 清除数组中的所有元素
-
...
-
public class ArrayListDemo {
public static void main(String[] args) {
//创建ArrayList对象 泛型(参数化类型)
ArrayList<String> list = new ArrayList<String>();
list.add("helloworld");
list.add("jack");
list.add("rose");
//获取指定位置的元素
System.out.println(list.get(2));
//移除指定位置的元素
list.remove(1);
//获取容器的长度(元素个数)
System.out.println(list.size());
//清空集合(数组)中所有元素
list.clear();
}
}
二维数组(多维数组)
可以将数组作为另个数组的元素,即数组中的数组(二维数组,三维数组)
int[][] i = new int[3][3]int[][][] j = new int[3][3][3]
//二维数组静态初始化
int[][] i = {{1,2,3},{4,5},{6,7,8,9}};
//二维数组遍历
for(int m = 0;m < i.length;m++){
for(int n = 0;n < i[m].length ;n++){
System.out.print(i[m][n]+" ");
}
System.out.println();
}
面向对象程序设计-信息隐藏(封装)
面向对象语言通常包含三大特征:
-
封装
-
继承
-
多态
其中封装(信息隐藏)是对对象的一种保护机制,通过将对象的属性或者方法设置为private,从而使得外界不能通过对象轻易访问器属性或方法,封装即将对象的属性和行为捆绑为一个逻辑单元,并将对象的属性设置为私有,通过公开的方法对其进行操作,从而有效避免外界未经授权而直接操作属性数据(可能会带来一些安全性问题)。
代码示例:
public class User{
private String username;
private String password;
private int age;
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
类之间关系
横向关系
-
依赖关系
-
关联关系
-
组合关系
-
聚合关系
纵向关系
-
继承关系
-
实现关系
继承
继承是面向对象语言的三大特征之一,通过继承关系可以实现方法和属性的复用,从而提高类的可扩展性,子类继承父类之后,可以不受限制的使用父类中的非私有(private)元素继承语法:
继承注意事项
-
java只能存在单继承,即:一个子类只能有一个直接父类
-
可以通过多重继承的方式实现多个父类方法复用
-
java中的类可以同时被多个子类继承
-
子类继承父类后可以使用父类中的方法和属性,但是构造器不允许继承
-
在构造子类对象时,先调用父类构造器
多态实现策略-方法的重写(Override)与重载(Overload)
重写
在某些情况下父类中的方法不一定能够完全满足子类需求,此时,子类中可以通过对父类的方法覆盖从而完成另一种方法实现,这个操作就称之为方法重写(override)
public class Animal{
public void bark(){
System.out.println("emmmmm.....");
}
}
public class Dog extends Animal{
//当父类方法不能完全满足子类需求时可以通过重写的方式对父类方法覆盖
@Override
public void bark(){
System.out.println("汪汪汪....");
}
}
方法重写
-
方法的重写发生在存在继承关系的两个类中子类
-
子类在重写方法时方法名称必须保持与父类一致(包括大小写)
-
子类重写父类方法时返回值类型必须保持跟父类一致
-
子类重写父类方法时参数列表必须保持与父类方法参数列一致
-
子类重写父类方法时,方法的访问权限范围不能小于父类方法