JavaSE

前提

​ Java相当于C++ - -,是因为JVM接管了用户的指针和内存管理。Java分三种JavaSE、JavaME、JavaEE( edition)。

​ 配置环境:JAVA_HOME – D:\Environment\Java\jdk1.8.0_05。PATH – %JAVA_Home%\bin、%JAVA_Home%\jre\bin。查看:cmd:java -version

​ JDK > JRE > JVM。

java

NON-NLS-1$的含义 就 是non need localize string 的缩写。

jdk文件夹:

  • bin存可执行文件例如java.exe和javac.exe。
  • include包含c语言的头文件。
  • lib存放的是jar包库文件
  • src.zip\java是存放Java库的核心代码(.java)
  • jre\lib\rt.jar是运行时核心代码,同上(.class

rt.jar:

  • text、beans、security
  • rmi:RMI(Remote Method Invocation,远程方法调用),它大大增强了Java开发分布式应用的能力
  • nio(new)区别于io:io存在buffer中,线程非阻塞。而io,在读取时,线程阻塞、io
  • applet,Apple是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页。

javaAPI

基本代码

第一个代码

public class Hello{			//新建Hello类
	public static void main(String[] args){  //主函数main,args是arguments的缩写
		System.out.print("hello ,world");
	}
}

(DOS操作)cmd:

#提前写好Hello.txt后改Hello.java
#cmd
javac Hello.java   #生成Hello.class字节码文件			
java Hello		  #输出hello world		//自动找寻.class字节码文件

​ 使用 java 命令,将源文件(.java)编译成对应的字节码文件(.class)。字节码文件是二进制流文件。字节码文件非常紧凑,在JVM中占用少量的内存。每个类(或者接口)都单独占据一个字节码文件。类中所有信息都在字节码文件中有所描述,由于字节码文件非常灵活,它对类的描述能力甚至强于java源文件。

cmd:

#编写ForOut.txt之后ForOut.java
public class ForOut {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("args["+i+"]:"+args[i]);
        }
    }
}
#cmd
E:\test>javac ForOut.java

E:\test>java ForOut zhang qing lin
args[0]:zhang
args[1]:qing
args[2]:lin

数据类型:

  • 基本类型:8大基本类型。
  • 引用类型:数组,类,接口。

数字&字符:

int a = 100;
(short)a		//强转

System.out.println((int)12.4);   //12
System.out.println((int)-13.4);		//-13,直接去尾即可

char c1 = 'a';		//字符用单引号
int a = c1+1;
System.out.println(a);			//98
System.out.println((char)a);    //输出b 

char c = '\u0061';			//字符为两个字节
System.out.println(c);		//a
System.out.println('\u0061');	//a

变量赋值:

int money = 10_0000_0000;	//数字多的话可以加下划线
int years=20;
System.out.println(money);          

long total1 = years*money;//越界
long total2 = (long)money*years;//正确

变量作用域:

  • 局部变量:main或者方法里的变量
  • 实例变量:无static
  • 类变量:static
public class Test {
    static final String name="adair";//类常量
    static int score= 100;  //类变量
    int money;//实例变量

    public static void main(String[] args) {
        Test test = new Test();
        test.money = 100;

        System.out.println(name);	//adair。在类里面直接使用
        System.out.println(Test.name);
        System.out.println(test.name);
        System.out.println(test.money);
    }
}

运算符:

  • 算数运算符:加减乘除,商余,++,- -
  • 赋值运算符
  • 关系运算符
  • 逻辑运算符,与或非
  • 位运算符& | ^ ~ << >>
  • 条件运算符? :
  • 扩展赋值运算符

基本运算:

double pow = Math.pow(2,3);//不用import static java.lang.Math.pow;
System.out.println(pow);

boolean a =true;
boolean b = false;
System.out.println("a && b: "+(a&&b));

char a = 5;
System.out.println(a++<6);  //先比较,再自增

int a=10;
int b=20;
System.out.println(""+a+b);         //1020
System.out.println(a+b+"");         //30

JavaDoc命令:生成api文档@auther,version,since,param,return,throws

public class Test {
    String name;
  /**                            //输入/**回车即可自动生成
     * 
     * @param name
     * @return
     * @throws Exception
     */

  public String test(String name) throws Exception{
        return name;
    }
}
#cmd生成帮助文档
javadoc -charset utf-8 -encoding utf-8  Test.java

输入:

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int sum = 0;
        while (scanner.hasNextInt()){
            int temp = scanner.nextInt();   //得到输入的数字
            sum += temp;
            System.out.println("sum:"+sum);
        }
        //凡是属于IO流的类,如果不关闭会一直占用资源
		scanner.close();  
    }
}

提示:hasnext()表示有空格后面的就不要了。hasnextline()以回车为结束符,空格也会当成回车处理。

Scanner scanner = new Scanner(System.in);
if(scanner.hasNextLine()){
    String str = scanner.nextLine();
    System.out.println(str);
}
//凡是属于IO流的类,如果不关闭会一直占用资源
scanner.close();   

switch:

char grade = 'B';
switch (grade){	//string类型也可以
    case 'A':
        System.out.println("优秀");break;		//没有break会case穿透
    case 'B':
        System.out.println("良好");break;
    default:
        System.out.println("不知道");
}

​ 流程控制:顺序,选择,循环(break,continue,标签)。

outer: for (int i = 2; i < 1000; i++) {		//标签设置
        continue outer;
}

注释:

//行内注释

/*
多行注释
*/

/**文档注释:javadoc生成帮助文档
*
*/

​ 包机制简述:。

​ 标识符 vs 关键字:。

​ 类型转换:高到低,低到高。

Method

​ 重载 vs 重写:简述区别。

使用method:

  • 类名.方法名:需要static修饰此方法。
  • 对象.方法名

​ Person student = new Student();student.test():如果test()动态则使用Student.test(),如果test()静态,使用Person.test()。

​ 子类继承抽象类或者实现接口,必须实现全部的abstract修饰的方法。

可变参数:

#int...nums;则nums可变参数,可以看作数组
public class Test {
    public static void main(String[] args) {
        output(2,3,4,5,6,7);
    }
    public static void output(int...nums){	//固定参数必须要放到可变参数之前
        for (int num : nums) {			//sout(Arrays.toString(nums))
            System.out.println(num);
        }
    }
}

数组:(成员也可是应用变量)

public class Test {
    public static void main(String[] args) {
        int[] nums={2,3,4,7,5};	

        System.out.println(nums);//[I@7ea987ac

        Arrays.sort(nums);//通过方法对nums操作:排序
        System.out.println(Arrays.toString(nums));
    }
}
#总结:Arrays中的静态方法直接使用
Arrays.sort(nums);
Arrays.toString(nums)

Class

​ OOP vs POP vs FP。java/C++是OOP,C是POP

三大特性:封装,继承,多态

  • 封装:利用private,然后set/get
  • 继承 :单继承
  • 多态:父类的引用指向子类对象,可以用stanceof判断是否可以类型转换。

范围:

类内部本包子类外部包
public
protected
default
private

​ new对象的本质就是在调用构造器。有参构造→(必有)→无参构造。super和this不可同时在构造器。

InnerClass

  • 种类:静态内部类,匿名内部类(监听事件),成员内部类,局部内部类
  • 极其精简:lambda
  • 成员内部类:
public class OuterClass {
    private String outerName;
    public void display(){
        System.out.println("OutClass display");
        System.out.println(outerName);
    }
    
    public class InnerClass{
        private String innerName;
        public InnerClass() {
            innerName = "inner name";
        }
        public void display(){
            System.out.println(" InnerClass display");
            System.out.println(innerName);
        }
    }
    
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();//成员内部类
        innerClass.display();
    }
}
  • 局部内部类(在方法内部,调用方法即可):
public class OuterClass {
    private String outerName;
    public void display(){
        class InnerClass{        //局部内部类,外部类直接调用方法即可
            public void print(){
                System.out.println("method inner class");
            }
        }
        new InnerClass().print();
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();
    }
}
  • 静态内部类:
public class OuterClass {
    private String outerName;
    //外部方法
    public void display(){
        System.out.println("OutClass display");
        System.out.println(outerName);
    }
    public static class InnerClass{
        private String innerName;
        public InnerClass() {
            innerName = "inner name";
        }
        public void display(){
            System.out.println(" InnerClass display");
            System.out.println(innerName);
        }
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.display();
        OuterClass.InnerClass innerClass = new InnerClass();//类型也可是InnerClass
        innerClass.display();
    }
}
#成员内部类,静态内部类:是否有static,静态内部类不要先创建外部类
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
OuterClass.InnerClass innerClass = new InnerClass();
  • 匿名内部类(eg用于监听)
public interface MyInterface {
    public void test();
}
public class MyImplement implements MyInterface{
    @Override
    public void test() {
        System.out.println("test1");
    }
}
public class Test {
	public static void main(String[] args) {
        MyInterface myInterface1 = new MyImplement();//接口类型指向实现类
        myInterface1.test();

        //new 接口(){匿名累内部类}
        MyInterface myInterface2 = new MyInterface() {
            @Override
            public void test() {
                System.out.println("test2");
            }
        };
        myInterface2.test();
    }
}

重写(动态method):

public class Test {
    public static void main(String[] args) {
        Person student = new Student();//父类的引用指向子类
        student.test();    //输出Student。执行子类的方法

    }
}
public class Person {
    public void test(){
        System.out.println("Person");
    }
}
public class Student extends Person{
    @Override
    public void test() {
        System.out.println("Student");
    }
}

instanceof:

public class Test {
    public static void main(String[] args) {
        Object os = new Student();
        System.out.println(os instanceof Object);//1
        System.out.println(os instanceof Person);//1
        System.out.println(os instanceof Student);//1
        System.out.println(os instanceof Teacher);//0
        System.out.println(os instanceof String);//0

        Person ps = new Student();
        System.out.println(ps instanceof Object);//1
        System.out.println(ps instanceof Person);//1
        System.out.println(ps instanceof Student);//1
        System.out.println(ps instanceof Teacher);//0
//        System.out.println(ps instanceof String); //报错

        Student ss = new Student();
        System.out.println(ss instanceof Object);//1
        System.out.println(ss instanceof Person);//1
        System.out.println(ss instanceof Student);//1
//        System.out.println(ss instanceof Teacher); //报错
//        System.out.println(ss instanceof String);  //报错

    }
}
  • 父子类型,父高子低父转化为子,强制
Teacher th=new JavaTeacher();

Teacher th=new JavaTeacher();
JavaTeacher jt = (JavaTeacher)th;	//父类到子类,强制。子到父,自动

static代码块,空代码块,构造器:

public class Test {
    static {
        System.out.println("static代码块");
    }
    {
        System.out.println("空代码块");
    }
    public Test(){
        System.out.println("构造器");
    }
    public static void main(String[] args) {
        Test t1 = new Test();//static代码块   空代码块    构造器

        Test t2 = new Test();// 空代码块    构造器
    }
}

random:

public class Test {
    public static void main(String[] args) {
        //需要import static java.lang.Math.random;同pow类似
        System.out.println(random());
    }
}

抽象类:

public abstract class A {		//定义抽象类
    public abstract void test();
}
public class B extends A{		//继承抽象类
    @Override
    public void test() {	方法体	 }	//实现抽象方法
}

OO的精髓是接口

泛型

基本:

ArrayList<String> str = new ArrayList<String>();
str.add("aaa");
ArrayList<Integer> integers = new ArrayList<>(10);
integers.add(10);

泛型类:

public class Generic<T>{ //外部指定
    private T key;
    public Generic(T key) { 
        this.key = key;
    }
    public T getKey(){ 
        return key;
    }
}

泛型接口:

public class Demo {
    public static void main(String[] args) {
        System.out.println(new MyImplement("zhangsan").test());
    }
}
class MyImplement implements MyInterface<String>{
    private String str;
    public MyImplement(String str) {
        this.str = str;
    }
    @Override
    public String test() {
        return str;
    }
}
interface MyInterface<T>{
    T test();
}

Exception

throwable:exception(检查时,运行时)和error。ERROR是致命的(JVM引起的OOM,StackoverFlowError)。Exception是可被catch。

抛出异常,捕获异常:

public class Test {
    public static void main(String[] args) {
        try{
            System.out.println(1/0);	//ctrl+alt+T快速生成
        }catch (ArithmeticException e){             //不走
            System.out.println("ArithmeticException:b不可为0");
        }catch (Exception e){
            System.out.println("Exception:b不可为0");  //ArithmeticException:b不可为0
        }finally {
            System.out.println("结束");
        }
    }
}

函数抛出异常:

public class Test {
    public static void main(String[] args) {
        try {
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            System.out.println("抛出ArithmeticException");
        }
    }
    public void test(int a, int b) throws ArithmeticException{
        if(b==0){
            throw new ArithmeticException();//new 一个算数异常
        }
    }
}

自定义异常类:

public class Test {
    public static void main(String[] args) {
        try {
            test(0);
        } catch (MyException e) {
            System.out.println(e);
        }
    }
    public static void test(int a) throws MyException{
        if(a==0){
            throw new MyException();		//如果有构造器的话,还可以传递值
        }
    }
}
class MyException extends Exception{
    @Override
    public String toString() {
        return "wrong";
    }
}

Throwable

tips:异常 = 运行时异常 + 非运行时异常(编译异常)。非运行时异常:IOException、SQLException,必须处理否则无法编译,例如用catch捕获。

常用类

Integer

包装类:

int a = 10;
//装箱:基本类型→引用类型
Integer integer = new Integer(a);
Integer integer1 = Integer.valueOf(a);//valueOf是静态方法,-128~127是同一地址(Integer缓冲区)
//拆箱:引用类型→基本类型
int i = integer.intValue();

//JDK1.5之后,自动装箱,自动拆箱
Integer integer2 = a;
int a1 = integer2;
==============================================
Integer integer = new Integer(100);
Integer integer1 = new Integer(100);
System.out.println(integer == integer1);    //false。因为是不同的对象

Integer integer2 = 100; //Integer.Valueof(100),返回cache中的相同对象
Integer integer3 = 100;
System.out.println(integer2 == integer3);    //true

Integer integer4 = 200; //超出int的cache,new Integer(200)
Integer integer5 = 200;
System.out.println(integer4 == integer5);    //false

Integer类的方法:

============IntegerString==========
int i = 100;
String s = 100 + "";	//转换成字符串
String s1 = Integer.toString(i);    //转换成字符串
String s2 = Integer.toString(15, 16);   //s2="f"
String s3 = Integer.toHexString(15);    //同上
============StringInteger==========
String s = "100";
int i = Integer.parseInt(s);
String s1 = "true";
boolean b = Boolean.parseBoolean(s1);
String

String类:

String name = "adair";//name指向方法区,字符串池的内容“adair”
name="zhangsan";//没有修改数据,而是重新开辟了一片空间,name再次指向这个空间
String name1 = "zhangsan";  //name1和name同时指向“zhangsan”

//在方法区"java",堆"java"两个对象,堆指向方法区,归根还是一个存储
String str = new String("java");
String str1 = new String("java");
System.out.println(str1 == str);    //地址不同

============常用方法================
String s = "java是比较好的语言";
System.out.println(Arrays.toString(s.toCharArray()));//单独每个字符

String s = "java is,the   best";
String[] strings = s.split(" |,");//以空格和逗号分割字符串
for (String string : strings) {
System.out.println(string);
}

String s = "java is the best";//每个首字母大写
String[] s1 = s.split(" ");
for (String s2 : s1) {
    char c =(char) (s2.charAt(0) - 32);	
    System.out.print(c + s2.substring(1)+"\t");
}

#Character类的方法
Character.toUpperCase(c);
  • StringBuffer:多线程 效率低(安全)。
  • StringBuilder:单线程 效率高(不安全)。
StringBuffer sb = new StringBuffer();//new StringBuilder();
sb.append("hello");
sb.insert(0,"nihao");
sb.delete(0,5);
sb.delete(0,sb.length());
  • StringBuilder和StringBuffer都是比String节约时间的
BigDecimal
double a = 1.0; //double存储的就不是0.1
double b = 0.9;
System.out.println(a - b);//0.09999999999999998
System.out.println((1.4 - 0.5) / 0.9);//0.9999999999999999

BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
BigDecimal subtract = bd1.subtract(bd2);//add,multiply,divide
System.out.println(subtract);   //0.1

BigDecimal divide = new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(divide);     //1

//除不尽,如果不四舍五入的话,报错
BigDecimal divide1 = new BigDecimal("10").divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide1);    //3.33
Date
  • 目前很少用,如今使用Calendar

  • Unix:1970/1/1 0:0:0 GMT

System.out.println(new Date());	//Mon Mar 27 23:02:12 CST 2023
System.out.println(new Date().toLocaleString());//2023-3-27 23:03:23
System.out.println(new Date().getTime());//1970开始的mm

Date date1 = new Date();
//date2.after(date1);
//after,before,compareTo
Calendar
//Calendar是抽象类,需要通过静态方法getInstance()获取calendar
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime()); //Fri Apr 15 14:53:18 CST 2022
System.out.println(calendar.getTimeInMillis());//1970年
System.out.println(calendar.get(Calendar.YEAR));

Calendar calendar1 = Calendar.getInstance();//静态方法,直接使用即可
System.out.println(instance);   //输出很长
calendar1.set(Calendar.DAY_OF_MONTH,14);    //更改日期的号
calendar1.add(Calendar.HOUR_OF_DAY,1);
System.out.println(calendar1.getTime().toLocaleString());

int actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);//365
int actualMinimum = calendar.getActualMinimum(Calendar.DAY_OF_YEAR);//1
SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy--MM--dd");
String str = sdf.format(new Date());
System.out.println(str);

Date date = sdf.parse("2022--10--23");
System.out.println(date);
System
System.arraycopy(src,start,dest,start,length);
System.currentTimeMillis();
System.gc();
System.exit(0);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值