java基础

 

关于基础语法:

JVM 叫 Java 虚拟机,它也是整个 Java 技术的核心。Java 语言的跨平台就多亏了 JVM。

JDK 叫 Java 开发工具包,没有 JDK 就没有办法进行 Java 程序的开发。

JRE 叫 Java 运行环境,如果我们需要运行一个 Java 程序,就得安装 JRE。

流程控制:条件语句、循环语句、跳转语句。

局部变量,成员变量,类变量:

  1. 局部变量的作用域仅限于定义它的方法内。而成员变量的作用域在整个类内部都是可见的。
  2. 同时在相同的方法中,不能有同名的局部变量;在不同的方法中,可以有同名的局部变量。
  3. 成员变量和局部变量同名时,局部变量具有更高的优先级。

构造方法:每个类都有构造方法,在创建该类对象时被调用。构造方法名与类名相同,一个类可以定义多个构造方法。

                  在定义类的时候没有写构造方法,系统会默认生成一个无参构造方法,这个构造方法什么也不会做。

                  构造方法的重载,当方法名相同但是参数不同时,调用时会自动选择不同的参数选择相应的方法。

引用与实例对象:

                             Object x = new Object();      变量x其实是保存的是Object对象的引用

                             Object y = x:                         x与y地址相同即 x == y

final:

  1. final 修饰类,则该类不允许被继承,为最终类
  2. final 修饰方法,则该方法不允许被覆盖(重写)
  3. final 修饰属性:则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
  4. final 修饰变量,则该变量的值只能赋一次值,即常量。

如何去实现类的封装呢?

  1. 修改属性的可见性,在属性的前面添加修饰符 (private)
  2. 对每个值属性提供对外的公共方法访问,如创建 getter/setter(取值和赋值)方法,用于对私有属性的访问
  3. 在 getter/setter 方法里加入属性的控制语句,例如我们可以加一个判断语句,对于非法输入给予否定。

this:

     在setter方法中,如果方法中参数名和属性名一样(即当成员变量和局部变量之间发生冲突时),在属性名前面添加了 this 关键字(例如 this.age = age  //age刚好是参数名) 此时就代表将一个参数的值赋给当前对象的属性。同理 this 关键字可以调用当前对象的方法。

继承的特点

     1. 类拥有父类除 private 以外的所有属性和方法。

     2. 子类可以拥有自己的属性和方法。

     3. 子类可以重写实现父类的方法。

     4. Java 中的继承是单继承,一个类只有一个父类。

注:Java 实现多继承的一个办法是 implements(实现)接口,但接口不能有非静态的属性,这一点请注意。

多态:

     多态是指允许不同类的对象对同一消息做出响应。

     多态的实现条件:

            Java 实现多态有三个必要条件:继承、重写和向上转型(即父类引用指向子类对象)。

            只有满足上述三个条件,才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行                为。

     多态的实现方式:

            Java 中多态的实现方式:继承父类进行方法重写,抽象类和抽象方法,接口实现。

            抽象类:

                   1.用 abstract 修饰符定义抽象类。

                   2.用 abstract 修饰符定义抽象方法,只用声明,不需要实现。

                   3.包含抽象方法的类就是抽象类。

                   4.抽象类中可以包含普通的方法,也可以没有抽象方法。

                   5.抽象类的对象不能直接创建,通常是定义引用变量指向子类对象。

            接口:接口用于描述类所具有的功能,而不提供功能的实现,功能的实现需要写在实现接口的类中,并且该类必须实现                           接口中所有的未实现方法。

接口与抽象类的区别:

1.接口要被类实现,抽象类要被子类继承。

2.接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。

3.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。接口是设计的结果,抽象类是重构的结果。

内部类:              

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
  4. 内部类允许继承多个非接口类型、

静态内部类:是 static 修饰的内部类,这种内部类的特点是:

  1. 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问。
  2. 如果外部类的静态成员与内部类的成员名称相同,可通过 类名.静态成员 访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过 成员名 直接调用外部类的静态成员。
  3. 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名 = new 内部类()。

java常用类:

1.Arrays类 : 包含用于操作数组的各种方法(例如排序和搜索)。还包含一个静态工厂,允许将数组转为 List。

2.StringBuilder类: 它是可变的。它是 String 的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符串中间或附加到字符串末尾。

3.Math类:Math 类在 java.lang 包中,包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

4.System 类提供了以下功能:

  • 标准输入,标准输出和错误输出流;
  • 访问外部定义的属性和环境变量;
  • 加载文件和库的方法;
  • 以及用于快速复制数组的实用方法。

System 不可以被实例化,只可以使用其静态方法。

//从指定的源数组中复制一个数组,从源数组指定的位置开始,到目标数组指定的位置
public static void arraycopy(Object src,int srcPos, Object dest,int desPos,int length)
//返回以毫秒为单位的当前时间(从1970年到现在的毫秒数)
public static long currentTimeMillis()
//终止当前正在运行的Java虚拟机,status为 0时退出
public static void exit(int status)
//  运行垃圾收集器
public static void gc()
// 取得当前系统的全部属性
public static Properties getProperties()
//获取指定键的系统属性,如安装目录等
public static String  getProperty(String key)

5.Random 类用于生成伪随机数流,在 java.util包下。

      Random r = new Random();

      r.nextInt(100 + 1)  生成[0,100]     r.nextInt(100)  生成[0,100)  r.nextInt(m - n + 1) +n   生成n 到m 之间任意随机数

泛型与集合:

1.定义泛型的规则:

  • 只能是引用类型,不能是简单数据类型。
  • 泛型参数可以有多个。
  • 可以用使用 extends 语句或者 super 语句 如 <T extends superClass> 表示类型的上界,T 只能是 superClass 或其子类, <K super childClass> 表示类型的下界,K 只能是 childClass 或其父类。
  • 可以是通配符类型,比如常见的 Class<?>。单独使用 ? 可以表示任意类型。也可以结合 extends 和 super 来进行限制。
/*
使用T代表类型,无论何时都没有比这更具体的类型来区分它。如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。
*/
class Test<T> {
    private T ob;

    /*
    定义泛型成员变量,定义完类型参数后,可以在定义位置之后的方法的任意地方使用类型参数,就像使用普通的类型一样。
    注意,父类定义的类型参数不能被子类继承。
    */

    //构造函数
    public Test(T ob) {
        this.ob = ob;
    }

    //getter 方法
    public T getOb() {
        return ob;
    }


    //setter 方法
    public void setOb(T ob) {
        this.ob = ob;
    }

    public void showType() {
        System.out.println("T的实际类型是: " + ob.getClass().getName());
    }
}

public class TestDemo {
    public static void main(String[] args) {
        // 定义泛型类 Test 的一个Integer版本
        Test<Integer> intOb = new Test<Integer>(88);
        intOb.showType();
        int i = intOb.getOb();
        System.out.println("value= " + i);
        System.out.println("----------------------------------");
        // 定义泛型类Test的一个String版本
        Test<String> strOb = new Test<String>("Hello Gen!");
        strOb.showType();
        String s = strOb.getOb();
        System.out.println("value= " + s);
    }
}

编译运行:

$ javac TestDemo.java
$ java TestDemo
T的实际类型是: java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= Hello Gen!

2.Collection

      Collection 接口是 Java 集合框架里的一个根接口。它也是 List、Set 和 Queue 接口的父接口。Collection 接口中定义了可用于操作 List、Set 和 Queue 的方法——增删改查。

3. List

      List 是一个接口,不能实例化,需要一个具体类来实现实例化。List 集合中的对象按照一定的顺序排放,里面的内容可以重复。 List 接口实现的类有:ArrayList(实现动态数组),Vector(实现动态数组),LinkedList(实现链表),Stack(实现堆栈)。

      ArrayList  类实现一个可增长的动态数组,位于 java.util.ArrayList。实现了 List 接口,它可以存储不同类型的对象(包括 null 在内),而数组则只能存放特定数据类型的值。

     i. 先在 /home/project/ 创建一个学生类 Student.java

/**
 * 学生类
 */
public class Student {
    public String id;
    public String name;
    public Student(String id, String name){
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

     ii. 再在 /home/project/ 创建一个 ListTest.java,其中包含了一个学生列表,通过操作学生列表来管理学生

import java.util.*;


public class ListTest {

    //集合后面的<>代表泛型的意思
    //泛型是规定了集合元素的类型
    /**
     * 用于存放学生的List
     */
    public List<Student> students;


    public ListTest() {
        this.students = new ArrayList<Student>();
    }

    /**
     * 用于往students中添加学生
     */
    public void testAdd() {
        // 创建一个学生对象,并通过调用add方法,添加到学生管理List中
        Student st1 = new Student("1", "张三");
        students.add(st1);

        // 取出 List中的Student对象 索引为0 也就是第一个
        Student temp = students.get(0);
        System.out.println("添加了学生:" + temp.id + ":" + temp.name);

        Student st2 = new Student("2", "李四");
        //添加到list中,插入到索引为0的位置,也就是第一个
        students.add(0, st2);
        Student temp2 = students.get(0);
        System.out.println("添加了学生:" + temp2.id + ":" + temp2.name);

        // 对象数组的形式添加
        Student[] student = {new Student("3", "王五"), new Student("4", "马六")};

        // Arrays类包含用来操作数组(比如排序和搜索)的各种方法,asList() 方法用来返回一个受指定数组支持的固定大小的列表
        students.addAll(Arrays.asList(student));
        Student temp3 = students.get(2);
        Student temp4 = students.get(3);
        System.out.println("添加了学生:" + temp3.id + ":" + temp3.name);
        System.out.println("添加了学生:" + temp4.id + ":" + temp4.name);
        Student[] student2 = {new Student("5", "周七"), new Student("6", "赵八")};
        students.addAll(2, Arrays.asList(student2));
        Student temp5 = students.get(2);
        Student temp6 = students.get(3);
        System.out.println("添加了学生:" + temp5.id + ":" + temp5.name);
        System.out.println("添加了学生:" + temp6.id + ":" + temp6.name);
    }


    /**
     * 取得List中的元素的方法
     */
    public void testGet() {
        int size = students.size();
        for (int i = 0; i < size; i++) {
            Student st = students.get(i);
            System.out.println("学生:" + st.id + ":" + st.name);

        }
    }


    /**
     * 通过迭代器来遍历
     * 迭代器的工作是遍历并选择序列中的对象,Java 中 Iterator 只能单向移动
     */
    public void testIterator() {
        // 通过集合的iterator方法,取得迭代器实例
        Iterator<Student> it = students.iterator();
        System.out.println("有如下学生(通过迭代器访问):");
        while (it.hasNext()) {

            Student st = it.next();
            System.out.println("学生" + st.id + ":" + st.name);
        }
    }

    /**
     * 通过for each 方法访问集合元素
     *
     */
    public void testForEach() {
        System.out.println("有如下学生(通过for each):");
        for (Student obj : students) {
            Student st = obj;
            System.out.println("学生:" + st.id + ":" + st.name);
        }
        //使用java8 Steam将学生排序后输出
        students.stream()//创建Stream
                //通过学生id排序
                .sorted(Comparator.comparing(x -> x.id))
                //输出
                .forEach(System.out::println);
    }

    /**
     * 修改List中的元素
     *
     */
    public void testModify() {
        students.set(4, new Student("3", "吴酒"));
    }

    /**
     * 删除List中的元素
     *
     */
    public void testRemove() {
        Student st = students.get(4);
        System.out.println("我是学生:" + st.id + ":" + st.name + ",我即将被删除");
        students.remove(st);
        System.out.println("成功删除学生!");
        testForEach();
    }


    public static void main(String[] args) {
        ListTest lt = new ListTest();
        lt.testAdd();
        lt.testGet();
        lt.testIterator();
        lt.testModify();
        lt.testForEach();
        lt.testRemove();

    }
}

      iii. 编译运行:

$ javac Student.java ListTest.java
$ java ListTest

添加了学生:1:张三
添加了学生:2:李四
添加了学生:3:王五
添加了学生:4:马六
添加了学生:5:周七
添加了学生:6:赵八
学生:2:李四
学生:1:张三
学生:5:周七
学生:6:赵八
学生:3:王五
学生:4:马六
有如下学生(通过迭代器访问):
学生2:李四
学生1:张三
学生5:周七
学生6:赵八
学生3:王五
学生4:马六
有如下学生(通过for each):
学生:2:李四
学生:1:张三
学生:5:周七
学生:6:赵八
学生:3:吴酒
学生:4:马六
Student{id='1', name='张三'}
Student{id='2', name='李四'}
Student{id='3', name='吴酒'}
Student{id='4', name='马六'}
Student{id='5', name='周七'}
Student{id='6', name='赵八'}
我是学生:3:吴酒,我即将被删除
成功删除学生!
有如下学生(通过for each):
学生:2:李四
学生:1:张三
学生:5:周七
学生:6:赵八
学生:4:马六
Student{id='1', name='张三'}
Student{id='2', name='李四'}
Student{id='4', name='马六'}
Student{id='5', name='周七'}
Student{id='6', name='赵八'}

4.Map 接口

      用于存储键 / 值对。一个映射不能包含重复的键;每个键最多只能映射到一个值。我们可以通过键去找到相应的值。Map 中的键 / 值对以 Entry 类型的对象实例形式存在。 

      HashMap 是基于哈希表的 Map 接口的一个重要实现类。HashMap 中的 Entry 对象是 无序 排列的,Key 值和 value 值都可以为 null,但是一个 HashMap 只能有一个 key 值为 null 的映射(key 值不可重复)。

5.set接口

     Set 是元素无序并且不包含重复元素的 collection(List 可以重复),被称为集。

     HashSet 由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

6.Collections

      java.util.Collections 是一个工具类,他包含了大量对集合进行操作的静态方法。

关于异常:

      之所以要处理异常,也是为了增强程序的鲁棒性。异常都是从 Throwable 类派生出来的,而 Throwable 类是直接从 Object 类继承而来。

异常通常有四类:

  • Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。
  • Exception:可以处理的异常。
  • RuntimeException:可以捕获,也可以不捕获的异常。
  • 继承 Exception 的其他类:必须捕获,通常在 API 文档中会说明这些方法抛出哪些异常。

RuntimeExcption 异常(运行时异常)通常有以下几种:

  • 错误的类型转换
  • 数组访问越界
  • 访问 null 指针
  • 算术异常

一般来说,RuntimeException 都是代码逻辑出现问题。

非 RuntimeException(受检异常,Checked Exception)一般有:

  • 打开一个不存在的文件
  • 没有找到具有指定名称的类
  • 操作文件异常

受检异常是编译器要求必须处理的异常,必须使用 try catch 处理,或者使用 throw 抛出,交给上层调用者处理。

1. throws 声明异常

    throws 用于声明异常,表示该方法可能会抛出的异常。如果声明的异常中包括 checked 异常(受检异常),那么调用者必须捕获处理该异常或者使用 throws 继续向上抛出。throws 位于方法体前,多个异常之间使用 , 分割。

    把可能发生错误或出现问题的语句放到 try 语句块中,将异常发生后要执行的语句放到 catch 语句块中,而 finally 语句块里面放置的语句,不管异常是否发生,它们都会被执行。

public class CatchException {
    public static void main(String[] args) {
        try {
            // 下面定义了一个try语句块

            System.out.println("I am try block.");

            Class<?> tempClass = Class.forName("");
            // 声明一个空的Class对象用于引发“类未发现异常”
            System.out.println("Bye! Try block.");

        } catch (ClassNotFoundException e) {
            // 下面定义了一个catch语句块,多种异常可用多个catch语句
            System.out.println("I am catch block.");

            e.printStackTrace();
            //printStackTrace()的意义在于在命令行打印异常信息在程序中出错的位置及原因

            System.out.println("Goodbye! Catch block.");

        } finally {
            // 下面定义了一个finally语句块
            System.out.println("I am finally block.");
        }
    }
}

2. 自定义异常

      只需要让它继承 Exception 或其子类就行。在自定义异常类的时候,建议同时提供无参构造方法和带字符串参数的构造方法,后者可以为你在调试时提供更加详细的信息。

关于Lambda表达式:

    

关于IO:

      整个 Java.io 包中最重要的就是 5 个类。指的是 File、OutputStream、InputStream、Writer、Reader。

关于网络编程:

关于多线程:

关于JDBC:

关于反射:

关于正则表达式:

关于设计模式:

      

 

 

 

ps. 代码部分参照实验楼java简明教程,笔记待更新。  2020/5/8

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值