随便新建一个文件夹存放代码
新建一个java文件
代码
public class Hello{
public static void main(String[] args){
System.out.print("Hello,World!") ;
}
}
编译 javac java文件,会生成一个class文件
java Hello.java
运行class文件,java class文件
java Hello
编译型
解释型
.java ——> .class 通过编译器
java先编译,到操作系统才解释,两者特征都具有
JDK、JRE、JVM
书写注释是一个非常好的习惯
分类:单行注释Line comment、多行注释Block comment、文档注释Java Doc
//单行注释
/多行 注释/
//快捷键Ctrl+D
//文档注释: /** */
/**
*@Description HelloWorld
*/
有趣的代码注释
Java是一种强类型语言,要求严格,所有变量都必须先定义后使用
Java数据类型分类:
基本数据类型(primitive type):
数值类型:
Boolean类型:1位,true、false
引用数据类型(reference type):
Long类型要在数字后面加个L
Float类型要在数字后加个F
String不是关键字,是一个类
1Byte=8bit,1024B=1KB,1024KB=1M,1024M=1G,1024G=1TB
整数拓展、进制:二进制0b,十进制,八进制0,十六进制0x
int i1=10;//10
int i2=010;//8
int i3=0x10;//16
浮点数拓展
银行业务怎么表示?:
字符类拓展
char c1='A';//65
char c2='中';//20013
System.out.println((int)c1);
//字符强制转换成int型
char c3='\u0061';//a
布尔值拓展
boolean flag = true;
if(flag==true){}
if(flag){}
Java是强类型语言,每个变量都必须声明其类型
变量是程序中最基础的存储单元,要素包括变量名、变量类型、作用域
变量可以是基本类型,也可以是引用类型
变量作用域
布尔值默认是false,其余默认值是空
常量,程序运行过程中值不允许改变,一般使用大写
final double PI=3.14;
所有类成员变量、局部变量、类名、方法名应遵守首字母小写驼峰原则,常量由大写字母和下划线组成
一元运算符
注意语句执行顺序
幂运算
Math.pow(2,3);//输出2的3次方=8
与、或、非
逻辑运算都遵循短路运算
位运算
/*
A=0011 1100
B=0000 1101
A&B=0000 1100
A|B=0011 1101
A^B=0011 0001
~B=1111 0010
28=16 2222
计组,效率高
<< 二进制左移 *2
二进制右移 /2
*/
System.out.println(2<<3);//8
System.out.println(8<<3);//2
字符串连接符 +
int a=10;
int b=20;
System.out.println(""+a+b);//1020
System.out.println(a+b+"");//30
//字符串在前,会进行拼接;在后会进行计算
x?y:z如果x==true则结果为y,否则为z
优先级()
包的本质是文件夹,用于区别命名空间
一般利用公司域名倒置来作为包名
package com.baidu.www;
import com.kuang.base.;
//为通配符,导入所有类
为了使用某一个包的成员,有时需要import导包
javadoc命令用来生成自己的API文档
/**
用命令行javadoc生成或者使用IDEA生成
分类
单选择
双选择
多选择
嵌套型
public static void main(String[] args){
for(int j=1;j<=9;j++){
for(int i=1;i<=j;i++){
System.out.print(j+"*"+i+"="+(j*i)+"\t");
}
System.out.println();
}
}
Java5中引入,主要用于数组
for(声明语句:表达式){//代码句子}
声明语句:
表达式:要访问的数组名或者是返回值为数组的方法
public static void main(String[] args){
for(int i=1;i<=5;i++){
for(int j=5;j>=i;j--){
System.out.print("");
}
for(int j=1;j<=i;j++){
System.out.print("*");
}
for(int j=1;j<i;j++){
System.out.print("*");
}
System.out.println();
}
}
重载的原则:
public static void main(String[] args){
for(int i=0;i<args.length;i++){
System.out.println("args["+i+"]:"+args[i]);
}
}
Java5,JDK1.5之后
也称为不定向参数,一个方法中只能指定一个可变参数,它必须是方法中的最后一个参数
在方法的声明中,在指定参数类型后加一个省略号(double… numbers)
//可以传递多个int类型的i
public void test(int… i){
System.out.println(i);
}
public static void main(String[] args){
Demo4 demo4=new Demo04();
demo04.test(1,2,3,4,5,6,7,8,9);
}
递归的能力在于用有限的语句来定义对象的无限集合
递归结构包括两部分:
阶乘
public static int func(int n){
if(n==1) return 1;
else return n*func(n-1);
}
递归三阶段:边界阶段、前阶段、返回阶段
Java使用的是栈机制,基数不小的情况下能不用递归就要避免递归
Java内存分析
堆
栈
方法区
底层步骤
三种初始化
静态初始化:
动态初始化:
普通for循环和For-Each循环
数组作方法入参
数组作返回值
public static void reverse(int[] arrays){
int[] result = new int[arrays.length];for(int i=0,j=result.length-1;i<arrays.length;i++,j--){
result[j]=arrays[i];
}
return result;//数组作为返回值</code></pre>
}
形式
本质上是由一维数组进行数组的嵌套
int[][] array={{1,2},{2,3},{3,4},{4,5}}
/*
1,2 array[0]
2,3 array[1]
3,4 array[2]
4,5 array[3]
*/
java.util.Arrays
Arrays类中的方法都是static修饰的静态方法,在使用的时候直接使用类名调用,不能使用对象名来调用
常用方法
点进Arrays类点击左下方structure可以查看所有方法
int[] a={1,2,56,88,34,564,32};
System.out.println(a);//打印出数组对象对应的哈希值
System.out.println(Arrays.toString(a));//遍历数组并打印
Arrays.sort(a);//升序排序
Arrays.fill(a,2,4,0);//用0填充数组a2到4之间的所有元素
//时间复杂度为O(n^2)
//优化后的冒泡排序
public static int[] bubbleSort(int[] array){
int temp=0;
for(int i=0;i<array.length-1;i++){
boolean flag=false;//通过flag标识减少没有意义的比较
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
}
if(flag==false) break;
}
return array;
}
稀疏数组是一种由压缩算法产生的数据结构,是一个二维数组
当一个数组中大部分元素为0,或者同一值,可以使用稀疏数组来保存该数组
稀疏数组的处理方式
只记录有效值的行、列、值
//创建二维数组11*11 0:没棋子 1:黑棋 2:白棋
int[][] array1=new int[11][11];
array[1][2]=1;
array[2][3]=2;
//输出原始的数组
System.out.println("输出原始的数组:");
for(int[] ints:array1){
for(int anInt:ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
//转换为稀疏数组
//1.获取有效值的个数
int sum=0;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(array[i][j]!=0) sum++;
}
}
//2.创建一个稀疏数组
int[][] array2=new int[sum+1][3];
//sum+1为存放多少个有效值所需要数组长度,3为行、列、值
array2[0][0]=11;//多少行
array2[0][1]=11;//多少列
array2[0][2]=sum;//多少个有效值
//遍历二维数组,将非零的值存放在稀疏数组中
int count=0;
for(int i=0;i<array1.length;i++){
for(int j=0;j<array1[i].length;j++){
if(array1[i][j]!=0){
count++;
array2[count][0]=i;//第一行存横坐标
array2[count][1]=j;//第二行存纵坐标
array2[count][2]=[i][j];//存有效值
}
}
for(int i=0;i<array2.length;i++){
System.out.println(array[i][0]+"\t"+arrar2[i][1]+"\t"+arrar2[i][2]+"\t");
}
}
//稀疏数组还原原本数组
//1.读取稀疏数组
int[][] array3=new int[array2[0][0]][array2[0][1]];
//2.给其中的元素还原其值
for(int i=1;i<array2.length;i++){//第行头部信息不用读取
array3[array2[i][0]][array2[i][1]]=array2[i][2];//横纵坐标还原
}
//3.打印
for(int[] ints:array3){
for(int anInt:ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
修饰符 返回值类型 方法名(…){ 方法体 return 返回值; }
break和return的区别
方法命名原则:见名知意+驼峰原则
参数列表:可变长参数
IO流读文件一定会抛出异常public void readFile (String file) throws IOException
方法分为静态方法和非静态方法
实际参数和形式参数类型必须一一对应
Java都是值传递,引用传递时传递对象,本质也是值传递
int a=1;
public static void change(int a){ a=10 ;}//a的值不会改变,因为这个a时形参,与实际a无关
public static void change(Person person){ Person.name="wch"; };
//person是一个对象:指向的时一个具体的person,可以改变属性,本质还是值传递
高内聚、低耦合
应禁止直接访问一个对象的数据的实际表示,而是应该通过操作接口来访问,称为信息隐藏
属性私有,get/set
private关键字修饰属性,提供一些可以操作这些属性的get/set方法
封装的意义
重写都是方法的重写,与属性无关
重写只对非静态的、public修饰的方法有效
父类的引用指向了子类
静态方法的调用只与左边的定义的数据类型有关
注解:有功能的注释
重写的特点
重写的意义
A extends B;
A a = new A();
a.test();
B b = new A();
b.test();
动态编译,类型具有可拓展性
同一方法可以根据发送对象的不同而采取多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
多态存在的条件
多态指的是方法的多态,属性没有多态性
子类重写了父类的方法,就执行子类重写后的方法
对象执行的方法首先看左边对象的类型
父类和子类之间有联系,可以强制转换
类型转换异常:ClassCastException
Father f1=new Son();
static、final、private修饰的方法不能重写
Students extends Person;
Students s1=new Student();
Person s2=new Student();
//父类的引用指向子类,不能调用子类独有的方法,除非是子类中重写的父类方法
Object s3=new Student();
//对象执行的方法首先看左边对象的类型
前提:父类的引用指向子类的对象
作用:判断一个对象是什么类型
System.out.println(X instanceof Y);取决于X和Y是否存在父子关系
类型之间的转换
Object object=new Student();
System.out.println(object instanceof Student);//√
System.out.println(object instanceof Person);//√
System.out.println(object instanceof Object);//√
System.out.println(object instanceof Teacher);//×
System.out.println(object instanceof String);//×
static修饰的变量称为静态变量又叫做类变量
静态变量在内存中只有一个
非静态方法要实例化之后才可以调用,静态方法可以直接 类名.方法名 调用
执行顺序:静态代码块、匿名代码块、构造方法
静态导入包后可以直接使用包中的方法(random、PI)
import static java.lang.Math.random;
import static java.lang.Math.PI;
final修饰的类断子绝孙不能被继承
public void run(){}
public static void go(){}
new Student().run;
Student.go;
abstract修饰符
只有方法名字,其他没有
抽象类的所有方法必须要由继承的子类重写来实现方法
局限性:extends的单继承
抽象类的特点
抽象类可以提高开发效率,可扩展性提高
public abstract class Action{
public static void say(){System.out.println("hello")};
public abstract void daSomething();//不需要写方法体
}
接口只有规范(抽象方法),自己不能写方法
接口的本质是契约,是面向对象的精髓所在
声明类的关键字是class,声明接口的关键字是interface
接口中的方法默认为public abstract修饰的抽象方法
接口中的变量默认为public static final修饰的常量
implements继承接口,可以实现 伪多继承
public interface UserService{
//自动隐藏了
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
//多继承
public class UserServiceImpl implements UserService,TimeService
{
//必须重写接口的所有方法
@override
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
在一个类的内部再定义一个类
分类
通过这个外部类来实例化内部类
内部类可以获取外部类的私有属性、方法
一个java类中可以有多个class,但只能有一个public
public class outer{
private int id;
public void out(){"这是外部类的方法"};public void out(){
class inner{ }//局部内部类
};
public class Inner{
public void in(){"这是内部类的方法"};
}
public void getID(){System.out.println(id)};</code></pre>
}
//通过这个外部类来实例化内部类
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
class Apple{
public void eat(){}
}
new Apple().eat();//匿名内部类
分类
异常处理框架的思想:把异常当作对象处理,java.lang.Throwable是所有异常类的超类
Error类由Java虚拟机产生并抛出,大多数与程序员执行的操作无关
RuntimeException是Exception的重要子类,一般是程序员代码有错误
try、catch、finally、throw、throws
finally主要用于善后工作,出现异常后关闭资源程序
catch中的参数是想要捕获的异常类型
快捷键 Ctrl+Alt+T e.printStactTrace()打印错误的栈信息
throw主动抛出异常,一般在方法中使用
假设再方法中不能处理异常,则在方法上抛出异常
try catch好处:程序不会因为异常而停止,会继续执行
public static void main(String[] args){
int a=1;
int b=0; try{//监控区域
Sytem.out.println(a/b);
}catch(ArithmeticException){//捕获异常
System.out.println("程序有错");
}finally{//最终处理,一定会输出结果
System.out.println("finally");
}</code></pre>
}
if(b==0){
throw new ArithmeticException();
}
public void test(int a,int b ) throws ArithmeticException{
//假设在方法中不能处理异常,则在方法上抛出异常
if(b==0){
throw new ArithmeticException();
}
}
自定义异常只需要继承Exception类即可
处理运行时异常尽量合理规避同时辅助try-catch处理
在多重catch块后,可以加上一个catch(Exception)处理可能遗漏的异常
不确定的代码也可以try-catch
尽量使用finally结束程序释放占用的资源
public class myException extends Exception{
//detail>10就抛出异常
private int detail;
public myException(int a){ this.detail=a;//消息
}
//toString
public String toSting(){
return "myException{"+detail+'}';
}</code></pre>
}
//测试类当输入大于10抛出异常
手机扫一扫
移动阅读更方便
你可能感兴趣的文章