JAVA学习

一、JAVA入门

(1)hello world详解

1.文件后缀名为.java

2.编写代码

public class Hello{
	public static void main(String [] args){
		System.out.print("Hello,World!");
	}
}

3.编译javac java文件,生成class文件

4.运行class文件,java class文件

注意:文件名和类名必须保持一致,并且首字母大写

(2)程序运行机制

1.编译型

2.解释型

(3)IDEA开发

1.快捷语句

psvm=public static void main(String[] args) {}

sout=System.out.println("");

二、JAVA基础

(1)注释

1.单行注释 / /

2.多行注释

/*

*/

3.文档注释

/**

*

*/

(2)标识符和关键字

1.关键字

2.标识符

1.所有标识符都应该以字母,美元符($),下划线(-)开始

2.首字母后可以是 字母,美元符($),下划线(-),数字

3.标识符大小写敏感

(3)数据类型

强类型语言:所有变量必须定义后才能使用

小数:浮点数

float类型要在数字后面加F,long类型要在数字后面加L

String不是关键字,是一个类,字符串

char字符

boolean布尔值

进制:二进制 0b  十进制  八进制0  十六进制0x

最好完全避免使用浮点数进行比较

银行业务怎么表示?钱  BigDecimal  数学工具类

所有的字符本质还是数字,可用int将char字符强制转换为数字

转义字符 \t制表符  \n换行....

(4)类型转换

从低到高:byte,short,char<int<long<float<double

强制类型转换   (类型)变量名       从高到低

自动类型转换     从低到高

注意:不能对布尔值进行转换

(5)变量

Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域

1.作用域

1.类变量      在类里,static(修饰符,不存在先后顺序) 数据类型

2.实例变量   在类里,无static(从属于对象 ,如果不自行初始化,这个类型的默认值为0 ,0.0,布尔值为false,除了基本类型其他的默认值都是null )

package operator;

public class Demo02 {
    //实例变量:从属于对象
    String name;
    int age;
//main方法
    public static void main(String[] args) {
        //局部变量:必须声明和初始化值
        int i=10;
        System.out.println(i);
        Demo02 demo02=new Demo02();//变量类型 变量名字=new Demo02();
        System.out.println(demo02.age);
    }
}

3.局部变量    在方法里(必须声明和初始化值

2.变量的命名规范

类成员变量:首字母小写和驼峰原则     lastName  除了第一个单词以外,后面的单词首字母大写

局部变量:首字母小写和驼峰原则

常量:大写字母和下划线   MAX-VALUE

类名:首字母大写和驼峰原则 GoodMan

方法名:首字母小写和驼峰原则:runRun()

(6)常量

final 常量名=值;

常量名一般使用大写字符

(7)运算符

位运算符:^:相同为0,不同为1

<<左移  >>右移  位运算(二进制)

字符串连接符   “ ”+a+b string类型

 (在字符串前后加有区别)

(8)包机制

一般利用公司域名倒置作为包名(com.baidu.www)

创建包

导入包(为了使用某一个包的成员)

 import com.kuang.base.(通配符,导入这个包下所有的类)

 (9)JavaDoc生成文档

参数信息:

@author 作者名

@version 版本号

@since 指明需要最早使用的jdk版本

@param 参数名

@return 返回值情况

@throws 异常抛出情况

三、Java流程控制

(1)用户交互Scanner

基本语法:

Scanner s=new Scanner(System.in);

通过 Scanner类的next()和nextline()获取输入字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入数据

next():

1.一定要读取到有效字符才可以输入

2.对有效字符前遇到的空白,next()方法将其自动去掉

3.next()不能得到带有空格的字符串

nextLine():

1.返回的是输入回车之前的所有字符

2.可以获得空白

package Scanner;

import java.util.Scanner;//new Scanner()之后点一下提示第一个

public class Demo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//输完等号后面的,alt+回车 提示快捷键
        System.out.println("使用next方式接收:");
       //判断用户有没有用输入字符串
        if(scanner.hasNext()){
            String str=scanner.next();
            System.out.println("输出的内容为:"+str);
        }
scanner.close();//凡是属于IO流的类如果不关闭会一直占用资源,要用完就关掉
    }
}

(2)Scanner的进阶使用

判断是否为小数或整数并输出

package Scanner;

import java.util.Scanner;

public class Demo03 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int i=0;
        float f=0.0F;
        System.out.println("请输入整数:");
        if(scanner.hasNextInt()) {
            i=scanner.nextInt();
            System.out.println("整数数据:"+i);
        }
        else {
            System.out.println("输入的不是整形数据!");
            System.out.println("请输入小数:");
            if(scanner.hasNextFloat())
            {
                f=scanner.nextFloat();
                System.out.println("小数数据:"+f);
            }
            else {
                System.out.println("输入的不是小数数据!");
            }
        }
        scanner.close();
    }
}

输入多个数字,计算其总和与平均数

package Scanner;

import java.util.Scanner;

public class Demo05 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double sum = 0;//和
        int m = 0;//计算了多少个数字
        while (scanner.hasNextDouble()) {
            double x =scanner.nextDouble();
            m=m+1;
            sum=sum+x;
        }
        System.out.println(m+"个数的和为"+sum);
        System.out.println(m+"个数的平均值是"+(sum/m));//+号是用来拼接中间字符串的
        scanner.close();
    }

}

(3)顺序结构

是任何一个算法都离不开的一种基本算法结构

(4)选择结构

1.if选择结构

if(布尔表达式){}

else{}  if(){}

else{}  if(){}

else

equals判断字符串是否相等

一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行

2.switch多选择结构

switch(){
case 1:     break;
default:
}

jdk7后支持字符串String类型  csae"哈哈"

(5)循环结构

1.while循环

while(布尔表达式)
{  }

2.do...while循环

do{
}while(布尔表达式);

3.for循环

for(初始化;布尔表达式;更新){
}

4.增强for循环(重点用于数组)

格式:1.声明:变量类型    必须与数组类型相匹配

2.表达式:要访问的数组名

for(声明语句:表达式)
{}
package ShunXu;

public class forZengQiang {
    public static void main(String[] args) {
        int []numbers={10,20,30,40,50};
        for(int x:numbers){
            System.out.println(x);
        }
    }
}

5.打印九九乘法表

package struct;

public class ForDemo04 {
    public static void main(String[] args) {
        for (int i = 1; i <=9; i++) {
            for(int j=1;j<=i;j++)
            {
                System.out.print(j+"*"+i+"="+(j*i)+"\t");
            }
            System.out.println();
        }
    }
}

6.打印三角形

package struct;

public class TestDemo {
    public static void main(String[] args) {
//打印三角形5行
        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();
        }
    }
}

四、Java方法

package method;

public class Demo01 {
    //main方法
    public static void main(String[] args) {
        int sum=add(1,2);
        System.out.println(sum);

    }
    //加法
    public static int add(int a,int b){
        return a+b;
    }
}

重载:在一个类中,有相同的函数名称,但形参不同的函数(个数、类型、参数排列顺序不同)

(1)命令行传参

package method;

public class Demo03 {
    public static void main(String[] args) {
        //args.length  数组长度
        for (int i = 0; i < args.length; i++) {
            System.out.println("args["+i+"]:"+args[i]);
        }
    }
}

(2)可变参数

1.在方法声明中,在指定参数类型后加一个省略号(...)

2.一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明

package method;

public class Demo04 {
    public static void main(String[] args) {
        Demo04 demo04 = new Demo04();
        demo04.test(1,1,2,3,4,5,6);
    }
    public void test(int x,int...i){//可变参数必须放在最后面
        System.out.println(i[0]);//可以直接当成数组搞
        System.out.println(i[1]);
        System.out.println(i[2]);
        System.out.println(i[3]);
        System.out.println(i[4]);
        System.out.println(i[5]);
    }

}

(3)用可变参数比较大小

package method;

public class Demo05 {
    public static void main(String[] args) {
        //调用可变参数的方法
        printMax(1,2,3,45,6);
        printMax(new double[]{1,2,3});
    }
    public static void printMax(double...numbers){
        if(numbers.length==0)
        {
            System.out.println("No argument passed");
            return;
        }
        double result=numbers[0];
        //排序
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i]>result)
            {
                result=numbers[i];
            }
        }
        System.out.println("Max is"+result);
    }
}

(4)递归

递归:方法自己调用自己

递归结构包括两个部分:递归头:社什么时候不调用自身方法,如果没有头,将陷入死循环

递归体:什么时候需要调用自方法

1.递归实现阶乘

package method;

public class Demo06 {
    public static void main(String[] args) {
        System.out.println(f(3));
    }
    public static int f(int n){
        if(n==1){
            return 1;
        }
        else{
            return n*f(n-1);
        }
    }
}

五、Java数组

(1)数组的创建与声明

package array;

public class ArrayDemo01 {
    //变量的类型    变量的名字   =  变量的值
    public static void main(String[] args) {
        int[] nums;//声明一个数组
        nums=new int[10];//创建一个数组
        //int []nums=new int[10];    结合表达方式
        nums[0]=1;
        nums[1]=2;
        nums[2]=1;
        nums[3]=2;
        nums[4]=1;
        nums[5]=2;
        nums[6]=1;
        nums[7]=2;
        nums[8]=1;
        nums[9]=2;

        //计算所有元素的和
        int sum=0;
        //获取数组长度:arrays.length
        for (int i = 0; i < nums.length; i++) {
            sum+=i;
        }
        System.out.println(sum);
    }
}

(2)三种初始化

int []a,sout(a)输出的是数组a的引用       sout[a(0)]才是数组元素

char a[],sout(a)输出的是a的全部元素的值

package array;

public class ArrayDemo02 {
    public static void main(String[] args) {
        //静态初始化
        int []a={1,2,3,4,5,6,7,8};
        System.out.println(a[0]);
        //动态初始化
        int[] b=new int [10];
        b[0]=10;
        System.out.println(b[0]);
    }
}

(3)数组的使用

package array;

public class ArrayDemo04 {
    public static void main(String[] args) {
        int[]arrays={1,2,3,4,5};

    }
    //反转数组
    public static int[] 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;
    }
    //打印数组元素
    public static void printArray(int[] arrays){
        for (int i = 0; i < arrays.length; i++) {
            System.out.println(arrays[i]+"");
        }
    }
}

(4)二维数组

package array;

public class ArrayDemo05 {
    public static void main(String[] args) {
        int[][]array={{1,2},{2,3},{3,4},{4,5}};
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.println(array[i][j]);
            }
        }
        
    }
}

(5)Arrays类

package array;

import java.util.Arrays;

public class ArrayDemo06 {
    public static void main(String[] args) {
        int []a={1,6,894,9594,659,168489};
        //打印数组元素
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);//数组重新排序,升序
        System.out.println(Arrays.toString(a));
        Arrays.fill(a,0);//数组填充
        System.out.println(Arrays.toString(a));
    }
}

(6)稀疏数组

package array;

public class ArrayDemo07 {
    public static void main(String[] args) {
        //1.创建一个二维数组 11*11   0:没有棋子  1:黑棋  2:白棋
        int [][]array1=new int [11][11];
        array1[1][2]=1;
        array1[2][3]=2;
        //输出原始数组
        System.out.println("输出原始的数组");
        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
        System.out.println("==============");
        //转换为稀疏数组保存
        //获取有效值个数
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum);
        //2.创建一个稀疏数组的数组
        int[][]array2=new int[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]=array1[i][j];
                }
            }

        }
        //输出稀疏数组
        System.out.println("稀疏数组");
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]+"\t"
            +array2[i][1]+"\t"
            +array2[i][2]+"\t");
        }
        System.out.println("============");
        System.out.println("还原");
        //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.打印
        System.out.println("输出还原数组");
        for (int[] ints : array3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}

六、面向对象

(1)回顾方法的调用

static静态方法调用

 非静态方法调用

Java只有值传递

 

 (2)构造器

 构造器:

1.和类名相同

2.没有返回值

作用:

1.new本质在调用构造方法

2.初始化对象的值

注意点:定义有参构造之后,如果想使用无参构造,必须显示定义一个无参的构造

(3)封装性

属性私有,get/set

kage oop.demo04;

public class Student {
    //属性私有
    private String name;//名字
    private int id;//学号
    private char sex;//性别
    private int age;//年龄

    //get  获得这个数据
    public String getName(){
        return this.name;
    }
    //set  给这个数据设置值
    public void setName(String name){
        this.name=name;
    }
    //alt+insert     按住ctrl选择

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package oop;

import oop.demo04.Student;

public class Application {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("lb");
        System.out.println(s1.getName());
    }
}

(4)继承性

子类(派生类)继承父类(基类),关键字extends

ctrl+h  查看继承关系

在Java中,所有类,都默认直接或间接继承Object类

直接只能继承一个,但可间接的继承多个

1.super

 调用父类的构造器,必须要在子类构造器的第一行

super注意点:

1.super调用父类的构造方法,必须在构造方法的第一个

2.super必须只能出现在子类的方法或者构造方法中

3.super和this不能同时调用构造方法(因为都必须在第一行)

this:本身调用者这个对象            this(): 本类的构造器

super:代表父类对象的应用            super(): 父类的构造器

 2.方法重写

需要有继承关系,子类重写父类的方法

1方法名必须相同

2.参数列表必须相同

3.修饰符:范围可以扩大但不能缩小    public>protected>private

4.抛出的异样:范围可以被缩小但不能扩大

alt+Insert:override  重写 

(3)多态性

同一方法可以根据发送对象的不同而采用多种不同的行为方式

注意:1.多态是方法的多态,属性没有多态

2.父类和子类:有练习    类型转换异常(ClassCastException)

3.存在条件:继承关系,方法需要重写,父类引用指向子类对象      Father f1=new son():

4.如果方法为static(属于类,不属于实例),final(常量),private,则无法重写,因此没有多态

1.instanceof和类型转换

X instanceof Y       true/false

父转子需强制转换,子转父可直接转但可以能会丢失自己本来的一些方法

 父转子

 子转父

2.抽象类

抽象类的所有方法,继承它的子类,都必须去实现它的方法,除非子类仍是抽象类

 类是单继承的,接口可以多继承

package oop.demo08;

//abstract 抽象类:类 extends  单继承
public abstract class Action {
    //抽象方法,只有方法的名字,没有方法的实现
    public abstract void doSomething();
    //不能new这个抽象类,只能靠子类去实现它
    //抽象类中可以写普通的方法
    //抽象方法必须在抽象类中
    //存在的意义  提高开发效率
}

(4)接口

作用:1.约束

2.定义一些方法,让不同的人实现

3.接口不能被实例化,接口中没有构造方法

4.implements可以实现多个接口

5.必须要重写接口中的方法

6.public abstract(函数前面的修饰词)

7.public static final定义常量

package oop.demo09;
//类可以实现接口   implements 接口
//利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void run(String name) {

    }

    @Override
    public void timer() {

    }
}
package oop.demo09;

//interface 定义的关键字  接口都需要实现类
public interface UserService {
    //接口中所有的定义都是抽象的public abstract(写不写都行)
    void run(String name);
}
package oop.demo09;

public interface TimeService {
    void timer();
}

(5)内部类

A类中再定义一个B类     

一个Java类中可以有多个class类,但是只能有一个public class

package oop;

import oop.demo10.Outer;

public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.getID();

    }
}
package oop.demo10;

public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }
    public class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        //获得外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
    }

七、异常

package exception;

public class Demo01 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        //假设要捕获多个异常:从小到大    Error<Exception<Throwable
        try {//try监控区域
            if (b==0){
                throw new ArithmeticException();  //主动的抛出异常
            }
            System.out.println(a/b);
        }catch (ArithmeticException e){//想要捕获的异常类型
            System.out.println("程序出现异常,变量b不能为");
        }finally {//出不出异常都会执行,一般用来关闭程序
            System.out.println("finally");
        }

    }
}
package exception;

public class Test {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        //ctrl+alt+t   可直接调用包裹的函数
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            throw new RuntimeException(e);//打印错误的栈信息
        } finally {
        }

    }
}
package exception;

public class Test1 {
    public static void main(String[] args) {
        try {
            new Test1().test(1,0);
        } catch (ArithmeticException e) {
            throw new RuntimeException(e);
        }
    }
    //假设这方法中,处理不了这个异常
    public void test(int a,int b) throws ArithmeticException{
        if(b==0){
            throw new ArithmeticException();//主动的抛出异常,一般在方法中使用
        }
    }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值