Java基础
标识符
关键字 | | | | |
---|
abstract | assert | boolean | break | byte | case | catch | char | class | const | continue | default | do | double | else | enum | extends | final | finally | float | for | goto | if | implements | import | instanceof | int | interface | long | native | new | package | private | protected | public | return | strictfp | short | static | super | switch | syncheonized | this | throw | throws | transient | try | void | volatile | while |
注释
标识符注意点
- 所有的标识符都以字母(A-Z , a-z),美元符($),下划线(_)开始
- 首字符之后可以是字母,美元符,下划线,或者数字的任意字符组合
- 不能使用关键字作为变量名或者方法名
- 标识符对大小写敏感
- 可以使用中文命名,但是一般不建议这样去做
数据类型
强类型语言
Java的数据类型分为两大类
基本数据类型(Primitive Type)
- 数值类型
-
整数类型
- byte 1字节 :-127—127
- short 2字节 :-216—216-1
- int 4字节 : -232—232-1
- long 8字节 : -264—264-1
-
浮点类型
- boolean : 只有true与false
引用数据类型(Reference Type)
数据类型拓展
public class Practice {
public static void main(String[] args) {
int i = 10;
int i2 = 010;
int i3 = 0x10;
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
System.out.println("======================");
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);
float d1 = 2323156156654654646f;
float d2 = d1+1;
System.out.println(d1==d2);
System.out.println("=====================");
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int)c1);
System.out.println(c2);
System.out.println((int)c2);
System.out.println("Hello\nWord");
}
}
类型转换
-
Java是强类型语言,所以要进行有些运算时,需要进行类型转换 低 ········································-> 高
byte,short,char-> int -> long -> float -> double
-
运算中,不同类型的数据先转换为同一类型然后再进行计算
- 强制类型转换 (高 到 低)
- 自动类型转换 (低 到 高)
注意点
-
不能对布尔值进行类型转换 -
不能把对象类型转换为不相干的类型 -
再把高容量转换到低容量的时候,强制转换 -
转换时可能存在内存溢出问题,或者精度问题
public class Practice_2 {
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;
System.out.println(i);
System.out.println(b);
System.out.println("====================");
System.out.println((int)23.7);
System.out.println((int)-45.89f);
System.out.println("====================");
char c = 'a';
int d = c+1;
System.out.println(d);
System.out.println((char)d);
int money = 10_0000_0000;
int years = 20;
int total_1 = money*years;
long total_2 = money*years;
long total_3 = money*(long)years;
System.out.println(total_1);
System.out.println(total_2);
System.out.println(total_3);
}
}
变量
变量:可以修改的值(c语言 可修改的左值) Java是一种强类型语言,每个变量都必须声明其类型 变量要素包括:变量名,变量类型,作用域
- 注意事项
- 每个变量都有类型,基本类型或者引用类型
- 变量名必须是合法的标识符
- 一条完整的语句声明变量以分号结束
变量作用域
- 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型
- 实列变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
常量
初始化后不可以改变的值
命名规范
- 所有变量,方法,类名:见章知意
- 类成员变量,局部变量,首字母小写和驼峰原则:如 lastName , monthSalary
- 常量:大写字母和下划线:如 MAX_VALUE
- 类名:首字母大写和下划线
- 方法名:首字母小写和驼峰原则
public class Practice_3 {
static double salary = 2500;
String name;
int age;
static final double PI = 3.1415;
public static void main(String[] args) {
int i = 10;
System.out.println(i);
Practice_3 practice_3 = new Practice_3();
System.out.println(practice_3.age);
System.out.println(practice_3.name);
System.out.println(salary);
System.out.println(PI);
}
public void add(){
}
}
Java运算符
- 算数运算符:+ ,-,*,/,++,–
- 赋值运算符:= ,+= ,-= ,*= ,/=
- 关系运算符:< , > , >= , <= , == , !=
- 逻辑运算符:&& , || , !
- 位运算符:& , | , ^ , ~ , >> , << ,>>>
- 条件运算符: ? :
包机制
Java 包(package)
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间
import 关键字
为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 “import” 语句可完成此功能。
-
在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为: import package1[.package2…].(classname|*);
-
如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略
JavaDoc
Scanner
Java.util.Scanner 是Java5的新特性,通过Scanner类来获取用户的输入- 基本语法:
Scanner s = new Scanner(Syatem.in); next() 和 nextLine() 方法 获取输入字符串,使用```hasNext() 和 hasNextLine() 判断是否还有输入的数据
package com.baidu.www.scanner;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接受: ");
if (scanner.hasNext()){
String str = scanner.next();
System.out.println("输出的: "+str);
}
scanner.close();
}
}
package com.baidu.www.scanner;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接受: ");
if (scanner.hasNextLine()) {
String str = scanner.nextLine();
System.out.println("输出的: " + str);
}
scanner.close();
}
}
结构
顺序结构
选择结构
-
if else 结构 -
switch 结构 -
goto 结构
循环结构
- While循环
- Do While循环
- For 循环
- 增强for循环
continue,break
package com.baidu.www.scanner;
public class Demo03 {
public static void main(String[] args) {
int[] number = {10,20,30,40,50};
for (int i = 0; i < 5; i++) {
System.out.println(number[i]);
}
System.out.println("==============");
for (int x:number){
System.out.println(x);
}
}
}
方法
方法的定义
- 修饰符 :可选,告诉编译器如何调用该方法。定义了该方法的访问类型
- 返回值类型 :returnValueType ,没有返回值void
- 方法名 :是方法的实际名。方法名和参数表共同构成方法签名
- 参数类型 :
- 形式参数 :被调函数中使用的在函数头中声明的参数
- 实际参数 :调用函数时传递给函数时的实际值
- Java方法传递参数均为值传递
- 方法体 :方法体包含具体的语句,定义方法的功能
- 异常抛出
方法重载
- 重载就是在一个类中,有相同的函数名称,但形式参数不同
- 方法重载的规则
- 方法名称必须相同
- 参数列表必须不同(个数,类型,参数排列顺序不同等)
- 方法的返回值类型可以相同也可以不同
- 仅仅返回类型不同不足以成为方法的重载
- 实现理论:
- 方法名称相同时,编译器会根据调用方法的参数个数,类型,顺序等逐个去匹配方法,如果失败会报错
package com.baidu.www.method;
public class Demo02 {
public static void main(String[] args) {
double max_1;
int max_2;
max_1 = max(20.0,10.0);
max_2 = max(20,10);
if (max_1 == -1)
System.out.println("equal");
else
System.out.println(max_1);
System.out.println((max_2==0 ? "equal" : max_2));
}
public static int max(int x1,int x2){
if(x1 == x2)
return 0;
else
return (x1 > x2) ? x1 : x2;
}
public static double max(double x1,double x2){
if(x1 == x2)
return -1.0;
else
return (x1 > x2) ? x1 : x2;
}
}
方法的递归
- 递归就是A方法自己调用自己
- 递归包括两个部分:
- 递归头:什么时候不调用自己,如果没有头,将陷入死循环
- 递归体:什么时候需要调用自身方法
package com.baidu.www.method;
public class Demo04 {
public static void main(String[] args) {
System.out.println(test(10));
}
public static int test(int n){
if (n==1)
return 1;
else
return n*test(n-1);
}
}
方法的调用
-
静态方法 -
非静态方法 -
形参和实参 -
值的传递和引用传递 -
this关键字
数组
数组的定义
- 数组是相同类型的数据的有效集合
- 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成
- 其中,每一个数据称为一个数据元素,每一个数组元素可以通过一个下标来访问它们
数组的声明创建
-
首先需要声明数组: dataType[] arrayRefVar;
dateType arrayRefVar[];
-
Java语言使用new操作符来创建数组,语法如下: arrayRefVar = new dateType[arraySize];
-
数组元素是通过索引访问的,数组索引从开始 -
获取数组长度:arrays.length
数组的使用
- 普通for循环
- For-Each循环
- 数组作方法传参
- 数组做返回值
package com.baidu.www.array;
public class ArrayDemo01 {
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5,6,7,8,9};
view(arrays);
System.out.println("\n");
view(revert(arrays));
}
public static void view(int[] arrays){
for (int array : arrays) {
System.out.print(array + " ");
}
}
public static int[] revert(int[] arrays){
int[] arrayRevert = new int[arrays.length];
for (int i=0,j=arrays.length-1;i <arrays.length;i++,j--){
arrayRevert[j] = arrays[i];
}
return arrayRevert;
}
}
二维数组
public class ArrayDemo02 {
public static void main(String[] args) {
int[][] arrays = {
{1,2,3,5,6,6},
{2,5,6,68,5},
{2,3,5,6,8,9,8},
{2,3,5,8,9,10}};
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.out.print(arrays[i][j]+" ");
}
System.out.println();
}
}
}
冒泡排序
package com.baidu.www.array;
import java.util.Arrays;
public class ArraysDemo03 {
public static void main(String[] args) {
int[] array = {1,2,3,2,5,7,8,9};
System.out.println(Arrays.toString(sort(array)));
}
public static int[] sort(int[] array){
for (int i = 0; i < array.length-1; i++) {
boolean flag = false;
for (int j = array.length-1; j > i; j--) {
if(array[j] < array[j-1]) {
array[j] = array[j]^array[j-1];
array[j-1] = array[j-1]^array[j];
array[j] = array[j-1]^array[j];
flag = true;
}
}
if(!flag)
break;
}
return array;
}
}
稀疏数组
import java.util.Arrays;
public class ArrayDemo04 {
public static void main(String[] args) {
int[][] arrays1 = new int[11][11];
arrays1[1][2] = 2;
arrays1[4][5] = 1;
for (int[] ints : arrays1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
System.out.println();
int num = 0;
for (int[] ints : arrays1) {
for (int anInt : ints) {
if (anInt != 0)
num++;
}
}
int[][] arrays2 = new int[num+1][3];
arrays2[0][0] = 11;
arrays2[0][1] = 11;
arrays2[0][2] = num;
int order = 0;
for (int i = 0; i < arrays1.length; i++) {
for (int j = 0; j < arrays1[i].length; j++) {
if(arrays1[i][j] != 0){
order++;
arrays2[order][0] = i;
arrays2[order][1] = j;
arrays2[order][2] = arrays1[i][j];
}
}
}
for (int[] ints : arrays2) {
System.out.println(Arrays.toString(ints));
}
System.out.println();
int[][] arrays3 = new int[11][11];
for (int i = 0; i < arrays2[0][2]; i++) {
arrays3[ arrays2[i+1][0] ][ arrays2[i+1][1] ] = arrays2[i+1][2];
}
for (int[] ints : arrays3) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}
Java内存
-
堆
存放new的对象和数组
可以被所有线程共享,不会存放别的对像引用
-
栈
存放基本变量类型(会包含这个基本类型的具体数值)
引用对象的变量(会存放这个引用在堆里面的具体地址)
-
方法区
可以被所有线程共享
包含了所有class和static变量
面向对象
? 对于描述复杂的事物,为了从宏观上把握,从整体上分析,我们需要使用面对对象的思路来分析整个系统。但是具体到微观操作,任然需要面对过程的思路去处理
面向对象编程(Object-Oriented Programming,OOP)
以类方式组织代码,以对象组织(封装)数据
三大特性:封装,继承,多态
对象和类
- 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等
- 类:类是一个模板,它描述一类对象的行为和状态
Object referenceVariable = new Constructor();
referenceVariable.variableName;
referenceVariable.methodName();
|