Java基础知识点整理(三)

构造方法的递归调用

员工类

package day07;

/**
 * 员工类
 * @author yangzc
 *
 */
public class Emp {
    
    private int empno;  //工号
    private String ename;   //姓名
    private boolean gender; //性别
    private  double salary; //薪资
    
    public Emp(int empno, String ename, boolean gender, double salary) {
        super();//调用Object类里面的构造方法
        this.empno = empno;
        this.ename = ename;
        this.gender = gender;
        this.salary = salary;
    }

    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getEmpno() {
        return empno;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", gender=" + gender + ", salary=" + salary + "]";
    }
    
}

程序员类

package day07;

/**
 * 程序员类
 * @author yangzc
 *
 */
public class SE extends Emp {
    
    private int hot;
 
    
    public SE(int empno, String ename, boolean gender, double salary, int hot) {
        super(empno, ename, gender, salary);//调用父类的构造方法初始化子类对象的4个属性
        this.hot = hot;
    }


    public SE() {
        this(-1,"undefined",false,5000.0,0);
    }

    
    public int getHot() {//查询接口
        return hot;
    }


    public void setHot(int hot) {//修改接口
        this.hot = hot;
    }
    
    
    @Override
    public void setSalary(double salary) {//定义子类的修改工资的接口
        if(salary>=0) {
            super.setSalary(salary);//调用父类的修改工资的接口
        }
    }


    public void show() {
        System.out.println(this.toString());
    }


    @Override
    public String toString() {
        return super.toString()+"SE [hot=" + hot + "]";
    }
    

    
}

测试

package day08;

import day07.SE;

public class SETest {

    public static void main(String[] args) {
        SE zhaoliu = new SE(1004,"赵六",false,9000.0,10);
        zhaoliu.setSalary(-10000.0);//通过子类对象调用子类的成员方法
        zhaoliu.show();//通过子类对象调用自己的成员方法
        
        //SE wangwu = new SE();
        //wangwu.show();
    }

}

分析:
运行程序,JVM进入到main方法里面,实例化赵六的时候,会进入到SE的有参构造方法里面,而该构造方法里面会调用父类Emp的构造方法,所以又会进入到Emp的构造方法里面,而Emp的构造方法里面通过super语句调用父类Object的构造方法,所以又会进入到Object类的构造方法里面,Object类的构造方法执行完后,回到Emp的构造方法里面初始化对象的empno, ename等属性,Emp的构造方法执行完后,回到SE的构造方法里面初始化对象的hot属性,SE的构造方法执行完后,回到main方法里面,将该对象赋给变量zhaoliu, 并继续执行后面的操作。

final关键字

1)使用final修饰的变量称为常量
2)使用final修饰的方法不能被重写
3)使用final修饰的类不能被继承,比如:String

Java基础知识点整理(三)_第1张图片
image.png

重写Object类的equals方法

equals方法的作用
比较两个对象的内容是否相同

自动生成的equals方法的代码如下:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)    //如果两个对象的内存地址是一样的
            return true;
        if (obj == null)    //如果另外一个对象obj是空的
            return false;
        if (getClass() != obj.getClass())   //如果两个对象的数据类型不一样
            return false;
        Student other = (Student) obj;      //强制转换
        if (sid != other.sid)               //如果当前学生的学号跟另外一个学生的学号不相等
            return false;
        return true;
    }

测试

Student ls = null;
Student zs = new Student();
System.out.println(zs.equals(ls));
System.out.println(ls.euqals(zs));//运行抛异常

变量的生命周期

局部变量的生命周期
函数(方法)里面声明的变量称为局部变量,局部变量的生命周期为:从该变量的声明开始,一直到函数执行结束
成员变量(属性)的生命周期
函数(方法)外面声明的变量称为成员变量(全局变量),成员变量的生命周期为:从对象创建开始,一直到对象被回收

Java垃圾回收机制(了解)

不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收。

Java基础知识点整理(三)_第2张图片
image.png

Java内存泄漏与内存溢出(了解)

1)内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory
2)内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
3)memory leak会最终会导致out of memory!
4)内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。
5)那么,Java内存泄露根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。

Java接口

使用interface关键字定义的数据类型称为接口。
1)接口里面定义的方法是抽象方法,访问权限默认是public
2)接口里面定义的变量是常量,并且默认是静态的,访问权限默认是public

定义接口的语法格式:

[访问权限] interface 接口名{
    ...
}

接口里面定义方法的语法格式:

返回值类型 方法名(数据类型 变量名,数据类型 变量名);

Java类实现(继承)接口的语法格式

class Student implements ICode,ITest{
    ...
}

使用class关键字定义的数据类型称为类,比如:
String,Math,Scanner,System,Integer,Random,Double,Student,Emp,SE,PM

类和接口都是引用类型
数组也是引用类型,比如:int[],String[]

int,short,byte,long,char,boolean,float,double都是基本类型

定义接口使用interface关键字

package day09;

/**
 * 编写程序的接口
 * @author yangzc
 *
 */
public interface ICode {
    boolean OPENSOURCE = true;//是否开源
    void javaProgram();
    void sqlProgram();
}


package day09;

/**
 * 测试程序的接口
 * @author yangzc
 *
 */
public interface ITest {
    void unitTest();
    void manualTest();
    void autoTest();
}

Java类实现(继承)接口使用implements关键字

package day06;

import day09.ICode;
import day09.ITest;

/**
 * 学生类
 * @author yangzc
 *
 */
public class Student implements ICode,ITest {
    public int sno;//学号
    public String sname;//姓名
    public boolean isMale;//性别
    public int age;//年龄
    public static int count=0;//学生的数量
    
    public Student() {
        count++;
    }


    @Override
    public void javaProgram() {
        System.out.println("System.out.println(\"hello world\");");
    }


    @Override
    public void sqlProgram() {
        System.out.println("select * from emp;");
    }


    @Override
    public void unitTest() {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void manualTest() {
        // TODO Auto-generated method stub
        
    }


    @Override
    public void autoTest() {
        // TODO Auto-generated method stub
        
    }
    
    
    
}


Collection和Collections的区别

1)Collection是接口
2)Collections是工具类,支持对List集合进行排序
说明:
Collection里面的E是泛型,表示集合里面元素的数据类型。泛型E可以理解为是数据类型的变量,用来接收1个引用数据类型。

List集合和数组的比较

1)数组对象一旦被创建,它的大小是固定不变的
2)List集合的大小是可变的
3)数组和List集合都支持通过下标(索引)访问数据
4)数组只能存储相同类型的数据
5)List集合可以存储不同类型的数据,比如:

List list = new ArrayList();
list.add(1);
list.add(3.142);
list.add('a');
list.add(true);
list.add("hello world");
System.out.println(list);
 
 

说明:
List是Collection的子接口
ArrayList是List接口的实现类
LinkedList是List接口的实现类

package day09;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayListTest {

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        List list = new ArrayList();
        list.add(1);
        System.out.println(list.size());//打印list集合的大小
        list.add(2);
        System.out.println(list.size());//打印list集合的大小
        list.add(3);
        System.out.println(list.size());//打印list集合的大小
        System.out.println(Arrays.toString(arr));
        System.out.println(list);
        System.out.println(arr.length);//打印数组arr的大小
    }

}

List集合的增、删、改、查

注意:删除元素会导致后面的元素会往前挪,这些元素的索引(下标)会发生变化

package day09;

import java.util.ArrayList;
import java.util.List;

import day07.Emp;
import day07.PM;
import day07.SE;

public class ArrayListTest2 {

    public static void main(String[] args) {
        Emp zs = new SE();
        Emp ls = new PM();
        List emps = new ArrayList();
        emps.add(zs);//添加程序员到员工集合里面
        emps.add(ls);//添加项目经理到员工集合里面
        emps.remove(1);//删除第2个员工
        System.out.println(emps.get(0));//查取第1个员工
        emps.set(0, null);//把第1个员工改为空
    }

}
Java基础知识点整理(三)_第3张图片
image.png

对List集合进行遍历

package day09;

import java.util.ArrayList;
import java.util.List;

public class ArrayListTest3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List emps=new ArrayList();
        emps.add(new SE(1001,"张三",true,20000,60));
        emps.add(new SE(1002,"李四",true,9000,70));
        emps.add(new PM(1003,"王五",true,10000,3,3000));  
        emps.add(new PM(1004,"赵六",true,12000,3,3000));
        for(Emp e:emps){
            e.show();
        }
        //emps.remove(2);//删除第三个员工
        //System.out.println(emps.get(2).getEname());
        //emps.set(0, new SE(1005,"刘建",true,8000,60));
        //System.out.println(emps.get(0).getEname());
    }

}

对List集合进行求和,求最值,求平均值

//未完成

对List集合进行排序

让Emp类实现比较器接口

package day07;

/**
 * 员工类
 * @author yangzc
 *
 */
public class Emp implements Comparable {
    
    private int empno;  //工号
    private String ename;   //姓名
    private boolean gender; //性别
    private  double salary; //薪资
    
    public Emp(int empno, String ename, boolean gender, double salary) {
        super();//调用Object类里面的构造方法
        this.empno = empno;
        this.ename = ename;
        this.gender = gender;
        this.salary = salary;
    }

    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }

    public int getEmpno() {
        return empno;
    }

    public void setEmpno(int empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + ", gender=" + gender + ", salary=" + salary + "]";
    }

    @Override
    public int compareTo(Emp o) {
        // TODO Auto-generated method stub
        return (int)(salary-o.salary);
    }
    
}

使用Collections工具进行排序(薪资从低到高)

package day09;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import day07.Emp;
import day07.PM;
import day07.SE;

public class ArrayListTest5 {

    public static void main(String[] args) {
        List emps=new ArrayList();
        emps.add(new SE(1001,"张三",true,20000,60));
        emps.add(new SE(1002,"李四",true,9000,70));
        emps.add(new PM(1003,"王五",true,10000,3,3000));  
        emps.add(new PM(1004,"赵六",true,15000,3,3000));
        System.out.println(emps);
        Collections.sort(emps);
        System.out.println(emps);
    }

}

ArrayList和LinkedList的区别

1)ArrayList的存储结构,查询的效率相对比较快
2)LinkedList的存储结构,增删改的效率相对比较快
3)都支持通过下标(索引)访问数据

对Set集合进行操作

说明:
1)Set是Collection接口的子接口
2)HashSet是Set接口的实现类
3)TreeSet是Set接口的实现类

package day09;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetTest {

    public static void main(String[] args) {
        //
        Set set = new HashSet();
        //
        set.add(1);
        set.add(3.142);
        set.add(3.142);
        set.add('a');
        set.add(true);
        set.add("hello word");
        //System.out.println(set);
        for(Object obj:set) {//遍历set集合
            System.out.println(obj);
        }
        set.remove(3.142);//删除
        set.add(Math.PI);
        System.out.println(set);
    }

}

 
 

List集合和Set集合的区别

1)List集合可以存储重复的内容
2)Set集合不能存储重复的内容
3)List集合支持通过下标(索引)访问数据
4)对于List集合,元素的位置跟添加的次序有关
5)对于Set集合,元素的位置跟添加的次序无关

package day09;

import java.util.LinkedList;
import java.util.List;

public class ArrayListTest4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List names=new LinkedList();
        System.out.println(names.size());//0
        names.add("张三");
        System.out.println(names.size());//1
        names.add("李四");
        System.out.println(names.size());//2
        //System.out.println(names.set(0,"李四"));
        System.out.println(names);
    }

}

package day09;

import java.util.HashSet;
import java.util.Set;

public class HashSetTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Set set=new HashSet();
        //
        set.add("张三");
        System.out.println(set.size());
        set.add("李四");
        System.out.println(set.size());
        set.add("张三");//添加失败
        System.out.println(set.size());
    }

}

Collection集合和Map集合的比较

1)Collection和Map都是接口
2)Collection类型的集合里面每个元素是1个对象,比如:List集合和Set集合
3)Map类型的集合里面每个元素是由1个键对象和1个值对象组成的,比如:HashMap
说明:
Map里面的K和V都是泛型,K表示键对象的数据类型,V表示值对象的数据类型

哈希表HashMap(Map接口的实现类)

package day09;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapTest {

    public static void main(String[] args) {
        //创建一个哈希表,用来存储用户的登录账号和密码
        Map table = new HashMap();
        table.put("admin","123");       //insert
        table.put("admin", "123456");//update
        table.put("sa", "456789");//insert
        table.put("root", "123456");//insert
        table.remove("sa");//delete
        //System.out.println(table.get("admin"));//select
        Set keys = table.keySet();//获取所有的账号
        for(String key:keys) {//使用key接收获取到的账号
            System.out.println(key+","+table.get(key));//打印账号和密码
        }
    }

}

包装类(自动装箱和自动拆箱)

自动装箱:
JDK5以上版本的编译器会自动调用包装类的valueOf方法,返回一个包装类型的实例
自动拆箱:
JDK5以上版本的编译器会自动调用包装类的拆箱方法,返回基本类型的数据

package day09;

public class IntegerTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer x = 3;//自动装箱
        //
        int y = new Integer(5);//自动拆箱
    }

}

package day10;

public class BooleanTest {

    public static void main(String[] args) {
        //自动装箱
        Boolean x = true;//Boolean x = Boolean.valueOf(true);
        System.out.println(x);
        Boolean j = new Boolean(true);
        //自动拆箱
        boolean y = j;//boolean y = j.booleanValue();
        System.out.println(y);//true
    }

}

package day10;

public class IntegerTest {

    public static void main(String[] args) {    
        //由于127在-128和127之间
        //会在方法区里面生成并缓存一个Integer实例,表示127这个整数
        Integer i = Integer.valueOf(127);
        //由于127在-128和127之间
        //会返回缓存里面的表示127的那个Integer实例
        Integer j = Integer.valueOf(127);
        //比较i和j这两个对象的地址
        System.out.println(i==j);//true
        //在堆内存里面创建一个Integer实例,表示128这个整数
        Integer m = Integer.valueOf(128);
        //在堆内存里面创建另外一个Integer实例,也表示128这个整数
        Integer n = Integer.valueOf(128);
        //比较m和n这两个对象的地址
        System.out.println(m==n);//false
    }

}

Java基础知识点整理(三)_第4张图片
image.png

String, StringBuffer, StringBuilder的比较

1)String类型的对象一旦被创建,该对象的内容不能被改变
2)多线程去操作同一个字符串对象的话,建议使用StringBuffer
3)StringBuilder适用单线程
4)都是字符串类型,支持对字符串进行检索、截取、替换
5)String里面的replace方法会在堆里面重新创建一个字符串对象,并且将新的字符串对象返回
6)StringBuffer里面的replace方法会对当前字符串进行替换,并且返回当前字符串对象
7)StringBuilder里面的replace方法会对当前字符串进行替换,并且返回当前字符串对象
8)它们的substring方法都会返回新的字符串对象
说明:
运行程序,会产生进程(操作系统分配的内存资源),进程是由线程组成的,通过线程执行任务(线程就是干活的)。执行主函数的线程称为主线程。

package day10;

/**
 * 
 * @author yangzc
 *
 */
public class StringBuilderTest {

    public static void main(String[] args) {
        //在堆内存创建一个字符串对象
        StringBuilder sb = new StringBuilder("hello");
        //StringBuilder类型对象的内容可以修改
        sb.append("world");
        System.out.println(sb);
        System.out.println(sb.length());//10
        sb.replace(0, 5, "java");//
        System.out.println(sb);//
        //
        String str = sb.toString();//返回String类型的字符串对象
        System.out.println(str);
    }

}

日期类型(Date和Calendar)

说明:
日历里面使用整数来表示日期属性,比如:1表示年,2表示月

日历里面的int常量 int值 表示的时间属性
Calendar.YEAR 1 年份
Calendar.MONTH 2 月份(从0开始)
Calendar.DAY_OF_MONTH 5
Calendar.HOUR_OF_DAY 11 小时
Calendar.MINUTE 12 分钟
Calendar.SECOND 13
package day09;

import java.util.Calendar;
import java.util.Date;

public class CalendarTest {

    public static void main(String[] args) {
        //获取一个日历
        Calendar cal = Calendar.getInstance();
        //Date now = cal.getTime();
        //System.out.println(now);
        //修改日历里面的年份
        cal.set(Calendar.YEAR, 1996);
        cal.set(Calendar.MONTH,9);
        cal.set(Calendar.DAY_OF_MONTH,10);
        //返回日历上的日期
        Date birth = cal.getTime();
        System.out.println(birth);
        //查取日历里面的年份
        System.out.println(cal.get(Calendar.YEAR));//1996
        //查取日历里面的月份
        System.out.println(cal.get(Calendar.MONTH));
        System.out.println(cal.get(Calendar.DAY_OF_WEEK));
    }

}

读写文件

//未完成

队列(Queue和Deque)

1)Queue是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口。
2)Deque是一个双端队列接口,两端都可进出,继承自Queue接口。Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。

package day10;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 对队列这个存储结构进行测试
 * 1)从尾部添加数据
 * 2)从头部删除数据
 * @author yangzc
 *
 */
public class QueueTest {

    public static void main(String[] args) {
        List list = new LinkedList();
        list.add(Integer.valueOf(1));
        list.add(3.142);//自动装箱
        list.add("helloworld");
        list.remove(0);
        System.out.println(list);
        Queue que = new LinkedList();
        que.add(1);
        que.add(3.142);
        que.add("helloworld");
        //System.out.println(que);
        que.remove(3.142);//
        //System.out.println(que);
    }

}

 
 
package day10;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 对双端队列的存储结构进行测试
 * @author yangzc
 *
 */
public class DequeTest {

    public static void main(String[] args) {
        //创建一个双端队列
        Deque dq = new LinkedList();
        //
        dq.addFirst(1);
        dq.addFirst(3.142);
        dq.addFirst("helloworld");
        System.out.println(dq);
        dq.removeLast();
        System.out.println(dq);
    }

}

 
 

函数重载

package day10;

import java.util.Arrays;

public class A2 {
    
    static void f(int x){
        x++;
    }
    
    static void f(int[] y){
        for(int i=0;i
Java基础知识点整理(三)_第5张图片
image.png

匿名内部类

//未完成

参考资料

[01] Java垃圾回收机制
https://www.cnblogs.com/dolphin0520/p/3783345.html
[02] java内存泄漏与内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html
[03] Java双端队列Deque使用详解
https://blog.csdn.net/devnn/article/details/82716447
[04] 队列(Queue)用法
https://www.runoob.com/java/data-queue.html
[05] Java 流(Stream)、文件(File)和IO
https://www.runoob.com/java/java-files-io.html
[06] 对 Java Integer.valueOf() 的一些了解
https://www.cnblogs.com/baxianhua/p/9335396.html
[07] Integer. valueOf()的使用
https://blog.csdn.net/weixin_37650458/article/details/85212730
[08] String.Format( )用法
https://blog.csdn.net/rlk512974883/article/details/80829985
[09] Java时间日期格式转换Date转String和String转Date
https://www.cnblogs.com/sharpest/p/7879377.html
[10] 在匿名内部类中声明比较器
https://blog.csdn.net/darron_r/article/details/52719413
[11] java中的匿名内部类总结
https://blog.csdn.net/hellocsz/article/details/81974251
[12] Java super关键字详解
https://blog.csdn.net/qq_33642117/article/details/51919528
[13] Java中的BigDecimal类你了解多少?
https://www.jianshu.com/p/c81edc59546c
[14] BigDecimal的用法详解
https://www.cnblogs.com/jpfss/p/8072379.html

微信扫一扫关注该公众号【测试开发者部落】

Java基础知识点整理(三)_第6张图片
image.png

点击链接加入群聊【软件测试学习交流群】
https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号: 511619105

你可能感兴趣的:(Java基础知识点整理(三))