JavaSE复习一

一、属性和局部变量的相同点和不同点

  `1.1 相同点:都是声明在类的内部

   1.2 不同点:属性在方法外,局部变量在方法内。

      属性是跟随类创建的时候一起创建,而局部变量只有在类调用的时候才会开辟相应的内存空间进行创建。

二、Object类

   2.1 equals的使用:

    Person类

public class Person {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    //Eclipse中自动生成的equals()方法
    @Override
    public boolean equals(Object obj) {
        System.out.println("Person equals().....");
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

//    //重写Object类中的equals()方法
//    public boolean equals(Object obj) {
//
//        if(this == obj){
//            return true;
//        }
//
//        if(obj instanceof Person){
//            Person p = (Person)obj;
//
//            if(this.name != null){
//
//                return this.name.equals(p.name) && this.age == p.age;
//            }else{
//                return p.name == null && this.age == p.age;
//            }
//
//
//        }else{
//            return false;
//        }
//    }

    //手动实现
//    @Override
//    public String toString() {
//        return "Person[name = " + name + ",age = " + age + "]";
//    }

    //Eclipse自动生成
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}
 1 /*
 2  * Object类中equals()的使用
 3  *
 4  * 面试题:== 和equals()的区别?
 5  *
 6  * 1. == 的复习:
 7  *   使用在基本数据类型和引用数据类型变量的比较上
 8  *       > 基本数据类型使用:比较两个变量的值是否相等
 9  *       > 引用数据类型使用:比较两个对象的地址值是否相等
10  *
11  * 2. equals()的使用:
12  *      ① 使用范围:只能使用在引用数据类型变量的调用上。
13  *   ② Object类中equals():仍然比较两个对象的地址值是否相等。
14  *       Object类中的源码:
15  *       public boolean equals(Object obj) {
16             return (this == obj);
17
18  *      }
19  *   ③ 像String、Date、包装类、File类等重写了Object类中的equals()方法,比较两个对象
20  *   的实体内容是否相等。
21  *   ④ 自定义类来说,我们通常调用equals()时,都不是比较二者的地址是否相同。而是希望比较二者的属性等
22  *   是否相同。那么意味着我们需要在自定义类中重写equals()方法,比较两个对象的内容是否相等。
23  *
24  */
25 public class EqualsTest {
26
27     public static void main(String[] args) {
28
29         // ==
30         //比较基本数据类型:
31         int m1 = 10;
32         int n1 = 10;
33         System.out.println(m1 == n1);//true
34
35         double d1 = 10;
36         System.out.println(m1 == d1);//true
37
38         char c1 = ‘A‘;
39         char c2 = 65;
40         System.out.println(c1 == c2);//true
41
42         //比较引用数据类型:
43         Person p1 = new Person();
44         Person p2 = new Person();
45         System.out.println(p1 == p2);//false
46         Person p3 = p1;
47         System.out.println(p1 == p3);//true
48
49         System.out.println("*****************************");
50
51         System.out.println(p1.equals(p2) + "$");//true $
52
53         String s1 = new String("abc");
54         String s2 = new String("abc");
55
56         System.out.println(s1 == s2);//false
57         System.out.println(s1.equals(s2));//true
58
59
60         Person p4 = new Person("Tom",12);
61         Person p5 = new Person("Tom",12);
62
63         System.out.println(p4.equals(p5) + "!");//false --->true
64     }
65 }

  2.2  String中的equals源码 :

  

   2.3 toString()方法的简介和使用:

/*
 * Object类中toString()的使用
 *
 * 1. 当在输出语句中,通过对象调用toString()方法时,和直接输出对象效果是一样的。
 * 2. java.lang.Object类中toString()定义如下:
 *    public String toString() {
         return getClass().getName() + "@" + Integer.toHexString(hashCode());
      }
 *  3.对于自定义类来说,如果没有重写Object类中的toString()方法,则默认输出对象的地址值。
 *     如果重写toString()的话,则重写的原则:输出对象的实体内容。
 *
 *  4.像String 、Date、File、包装类等都重写了Object类中的toString()。当调用toString()时,输出
 *  当前对象的实体内容。
 *
 *
 */
public class ToStringTest {

    public static void main(String[] args) {

        Person p1 = new Person("Tom",12);
        System.out.println(p1.toString());//[email protected] -->Person[name = Tom,age = 12]
        System.out.println(p1);//[email protected]>Person[name = Tom,age = 12]

        String str = new String("abc");
        System.out.println(str);//abc
    }
}

三、代码块

  3.1  代码块的执行顺序要先从类的加载机制开始讲起:

    3.1.2 类的加载机制:

(1)  父类的静态代码块

(2)  子类的静态代码块  

(3)  父类的非静态代码块

(4)  父类的构造器

(5)  子类的静态代码块

(6)  子类的构造器

  1 /*
  2  * 类的成员之四:代码块(或初始化块)
  3  * 1.作用:用来初始化类或对象的
  4  * 2.代码块的分类:静态代码块  vs 非静态代码块
  5  *
  6  * 3. 静态代码块
  7  *         >可以声明输出语句
  8  *         >随着类的加载而执行,仅执行一次
  9  *         >作用:初始化类的信息:类变量
 10  *         >静态代码块内部只能调用静态的属性和方法,不能调用非静态的属性和方法
 11  *         >静态代码块的加载要早于非静态代码块
 12  *         >类中声明了多个静态代码块,则按照声明的先后顺序执行
 13  *
 14  * 4. 非静态代码块
 15  *         >可以声明输出语句
 16  *         >随着对象的创建而执行
 17  *         >每创建一个对象,就执行一次
 18  *         >作用:初始化对象的信息
 19  *         >非静态代码块中可以调用静态的属性和方法,也可以调用非静态的属性和方法
 20  *         >类中声明了多个非静态代码块,则按照声明的先后顺序执行
 21  *
 22  *
 23  *
 24  *
 25  */
 26 public class BlockTest {
 27     public static void main(String[] args) {
 28 //        Person.show();
 29
 30         Person p1 = new Person();
 31
 32         Person p2 = new Person();
 33
 34
 35     }
 36 }
 37
 38 class Person{
 39
 40     //属性
 41     String name;
 42     int age;
 43
 44     static String nation;
 45
 46
 47     //非静态代码块2
 48     {
 49         System.out.println("non-static hello2");
 50     }
 51     //非静态代码块1
 52     {
 53         System.out.println("non-static hello1");
 54         age = 1;
 55
 56 //            nation = "CHN";
 57 //            show();
 58 //            name = "Tom";
 59 //            eat();
 60
 61     }
 62
 63     //静态代码块2
 64     static{
 65         System.out.println("static hello2");
 66     }
 67     //静态代码块1
 68     static{
 69         System.out.println("static hello1");
 70
 71 //        nation = "CHN";
 72 //        show();
 73         //调用非静态的结构:编译不通过
 74 //        name = "Tom";
 75 //        eat();
 76     }
 77
 78
 79
 80
 81
 82
 83     //构造器
 84     public Person(){
 85
 86     }
 87     public Person(String name,int age){
 88         this.name = name;
 89         this.age = age;
 90     }
 91
 92     //方法
 93     public void eat(){
 94         System.out.println("人吃饭");
 95     }
 96     public void walk(){
 97         System.out.println("人走路");
 98     }
 99
100     public static void show(){
101         System.out.println("我是一个人");
102     }
103
104 }

四、final关键字

  4.1 final关键字相关简介:

final可以用来修饰类、变量、方法

final修饰类:这个类不能提供子类。比如:String类

final修饰方法:此方法不能被重写。比如:Object类中getClass()

final修饰变量:表明此"变量"一旦赋值,就不可修改。--->常量

final修饰属性:常量。

final修饰局部变量:在调用之前必须赋值。一旦赋值,就不可修改。
比如: static final,全局常量 比如:PI

五、 abstract关键字

5.1  可以用来修饰:类、方法
5.2  具体的:
  5.2.1  abstract修饰类:抽象类
      5.1.1  此类不能实例化
      5.1.2  此类中定义的非静态方法,可以通过继承的方法,使用子类的对象进行调用
      5.1.3  抽象类中有构造器。此时的构造器的作用是便于子类对象实例化时调用

  5.2.2  abstract修饰方法:抽象方法
      5.2.1  抽象方法的特点:没方法体
      5.2.2  抽象类中可以没抽象方法,但是抽象方法所属的类一定是抽象类
      5.2.3  抽象类的子类如果重写了抽象父类中的所的抽象方法,则此子类就可以实例化
      5.2.4  抽象类的子类如果没重写抽象父类中的所的抽象方法,则此子类仍然是一个抽象类

5.3  注意点:
      5.3.1  abstract 不能用来修饰构造器、属性。
      5.3.2  abstract 修饰类,此时的类就不能再用final修饰。
      5.3.3  abstract 修饰方法,此时的方法不能再用final修饰。
      5.3.4  abstract 修饰方法,此时的方法不能再用private修饰 -->private的方法不能被重写
      5.3.5  abstract 修饰方法,此时的方法不能再用static修饰

六:接口 abstract

  

6.1  使用class来定义一个类,使用interface来定义一个接口

6.2  类和接口是并列的结构

6.3  接口内能定义哪些结构?

1.  jdk7及以前:只能定义全局常量 和 抽象方法

2.  全局常量:使用public static final修饰

3.  抽象方法:使用public abstract修饰

4.  通常定义常量和抽象方法时,可以省略这些修饰符。

5.  jdk8:接口中可以定义静态方法、默认方法

6.  jdk9:接口中可以定义私的方法

6.4  接口中不能定义构造器,不能直接实例化一个接口

6.5  类与接口是实现关系,使用implements表示。实现类一旦实现了接口,就获取到了接口中声明的
       全局常量和抽象方法。
  6.5.1 如果实现类重写了接口中的所抽象方法,则此类不是一个抽象类,可以实例化
  6.5.2 如果实现类没重写接口中的所的抽象方法,则此类仍然是一个抽象类,不能实例化

6.6  一个类可以实现多个接口:多实现。 vs 类的单继承

  格式: class AA extends BB implements CC,DD,EE{}

6.7  接口与接口之间是继承关系,而且是多继承的。
  interface A extends B,C{}

示例代码:

  1 package TestCode;
  2 /*
  3 @author Peny Chen
  4 @create 2019-10-05-16:58
  5 */
  6
  7 public class USBTest {
  8     public static void main(String[] args) {
  9
 10         Computer com = new Computer();
 11
 12         Flash flash = new Flash();
 13         //实参:接口的实现类的对象
 14         com.transferData(flash);
 15
 16         System.out.println();
 17         //实参:接口的实现类的匿名对象
 18         com.transferData(new Printer());
 19
 20         //实参:接口的匿名实现类的对象
 21         USB u1 = new USB(){
 22
 23             @Override
 24             public void startTrasfer() {
 25                 System.out.println("mp3开始播放音乐");
 26             }
 27
 28             @Override
 29             public void stopTransfer() {
 30                 System.out.println("mp3结束播放音乐");
 31             }
 32
 33         };
 34
 35         com.transferData(u1);
 36
 37         //实参:接口的匿名实现类的匿名对象
 38         com.transferData(new USB(){
 39
 40             @Override
 41             public void startTrasfer() {
 42                 System.out.println("电纸书开始传输数据");
 43             }
 44
 45             @Override
 46             public void stopTransfer() {
 47                 System.out.println("电纸书结束传输数据");
 48
 49             }
 50
 51         });
 52
 53     }
 54
 55 }
 56
 57
 58 class Computer{
 59
 60     public void transferData(USB usb){//体现接口的多态性:USB usb = new Flash();
 61
 62         usb.startTrasfer();
 63
 64         System.out.println("具体传输操作的细节....");
 65
 66         usb.stopTransfer();
 67     }
 68
 69
 70 }
 71
 72 interface USB{
 73     //定义接口的基本尺寸的常量:长、宽、...
 74
 75     public abstract void startTrasfer();
 76
 77     public abstract void stopTransfer();
 78
 79 }
 80
 81 class Flash implements USB{
 82
 83     @Override
 84     public void startTrasfer() {
 85         System.out.println("U盘开始传输数据");
 86     }
 87
 88     @Override
 89     public void stopTransfer() {
 90         System.out.println("U盘结束传输数据");
 91     }
 92
 93 }
 94
 95 class Printer implements USB{
 96
 97     @Override
 98     public void startTrasfer() {
 99         System.out.println("打印机开始传输数据");
100     }
101
102     @Override
103     public void stopTransfer() {
104         System.out.println("打印机结束传输数据");
105     }
106
107 }

运行结果:

6.8  抽象类和接口的异同?
  同:不能实例化。
  异:

    (1)抽象类有构造器;接口没有构造器。
    (2)类:单继承性。 接口:与类多实现,与接口多继承
    (3)类中声明属性、方法、构造器、代码块等
    (4)接口:java 7之前:常量、抽象方法
    (5)java8:静态方法、默认方法
    (6)java9:私有方法

七、内部类

  7.1   定义:

    在一个类A的内部定义另一个类B,此时类B就称作类A的内部类(InnerClass),类A就称作类B的外部类(OuterClass)

7.2  内部类的分类:

     成员内部类(直接声明在类内部,方法外)

     局部内部类(声明在外部类的方法内)

  7.3  成员内部类的理解:

    7.3.1  作为类

        可以内部定义属性、方法、构造器等

        可以被final修饰

        可以被abstract修饰

    7.3.2   作为外部类的成员

        可以调用外部类的属性、方法等

        可以被4种不同的权限修饰符修饰

        可以被static修饰

   7.4  成员内部类

      7.4.1  如何创建成员内部类的对象

1 //创建静态的成员内部类Dog的对象
2 Person.Dog dog = new Person.Dog();
3 dog.jump();
4
5 //创建非静态的成员内部类Bird的对象
6 Person p = new Person();
7 Person.Bird bird = p.new Bird();
8 bird.fly();

      

      7.4.2  如何在成员内部类中调用外部类的结构

 1 class Person{
 2
 3     String name = "周毅";
 4     //非静态的成员内部类
 5     class  heart {
 6
 7         String name = "勇敢的心";
 8             public void show(String name){
 9             System.out.println(name);//方法的形参
10             System.out.println(this.name);//内部类的属性
11             System.out.println(Person.this.name);//外部类的属性
12         }
13     }
14 }    

八、类的多态性质:

8.1 类的多种状态:向上转型和向下转型

详细步骤参考 博客 zhao_miao
https://blog.csdn.net/zhao_miao/article/details/83750898

这里补充一些知识点:

多态的提出是为了参数传递的便捷和通用,防止每次传递类类型参数之前需要 new一个对象出来,简化类类型参数的过程

8.2  多态的补充:

多态不适用于属性!编译和运行都看左边,即 Animal a1 = new dog();
a1.weight显示的父类Animal的weight属性

多态是编译时行为还是运行时行为?
多态是运行时行为

九、集合 数组和集合的区别

9.1  数组:有序可重复的序列,但是缺点是大小一旦固定就不可改变。

9.2  集合:
  Collection:

    List:(存储的元素有序可重复)

    ArrayList:底层是数组实现,线程不安全,插入效率不高,遍历效率高

    LinkedList:底层是循环双向链表实现,线程安全,频繁的插入和删除,效率高, 删除效率不高.

    Vector:底层是数组实现,线程安全

    Set:(存储的元素无序不可重复)

    HashSet:

    向HashSet中添加元素a,首先需要使用元素a所在类的hashCode()方法计算元素a的哈希值。此哈希值经过某种算法计算以后得到其在数组中的存放位置。
    如果此位置上没元素,则元素a添加成功。                                                                                                                    ---情况1
    如果此位置上元素b,需要比较两个元素的hash值,如果hash值不同,则元素a与元素b不相同,则元素a添加成功。 ---情况2
    如果hash值相同,调用元素a所在类的equals()方法,equals()返回值为true:认为元素a与元素b相同,元素a添加失败
    equals()返回值为false:认为元素a与元素b不相同,元素a添加成功                                                                                ---情况3

    添加成功的情况1:直接添加到数组位置上。
    添加成功的情况2、3:元素a与现的元素以链表的方式存储。“七上八下”(即JDK7采取向上扩展链表,JDK8采取向下扩展链表)

    结论:向HashSet中添加数据的话,要求数据所在的类要重写:hashCode()和equals()
    重写两个方法需要保证:hashCode() 和 equals()保持一致性。

    TreeSet:LinkedHashSet:作为HashSet的子类;可以照元素添加的顺序实现遍历(原因:使用了链表来记录元素添加的先后顺序。对于频繁的遍历操作,建议使用此类,效率偏高。

    LinkedHashSet:底层使用红黑树实现;能够对添加的数据实现排序

    Map:(存储的元素以k v 键值对存储)

    HashMap: 作为Map的主要实现类;线程不安全的,效率高;可以存储null的key和value

    TreeMap:TreeMap:可以实现对添加的数据实现排序。针对于key进行自然排序 或定制排序

    LinkedHashMap:作为HashMap的子类;可以照添加的顺序实现遍历操作,对于频繁的遍历操作建议使用此类,效率稍高

    CourrentHashMap:线程安全

    CourrentHashMap线程安全原理可以参考博客  junjiang3    https://www.cnblogs.com/junjiang3/p/8686290.html

原文地址:https://www.cnblogs.com/peny/p/11624424.html

时间: 2024-10-10 07:50:11

JavaSE复习一的相关文章

JAVASE复习

top 暑假每天中午更新 六花酱赛高 目录: 内部类 枚举类 垃圾回收 修饰符 与运行环境交互 内部类: 1. 外部类可以通过非静态内部类对象访问内部类的private属性,内部类可以直接访问外部类的private属性,说明外部类和内部类都是在“一个类中”,这样才能相互访问到对方的private属性 2. 非静态内部类的实例化:new Outer().new Inner();//这个很好理解,Inner需要用outer对象来实例化,Inner的命名空间是Outer 3. 静态内部类的实例化: n

javaSE复习之——线程

线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务 多线程的应用场景 迅雷多线程一起下载 服务器同时处理多个客户请求 多线程原理(单核CPU) 在电脑上运行多个程序时,其实cpu一次只能做一个事,做一段时间后然后换另一个另一个做一段时间,只是cpu的速度太快了,看起来就是同时做很多事,也就是说多线程其实只是表面上的多线程,底层cpu还是一次只能做一个事,但是这有个前提,那就是那个cpu是单核cpu,如果事多核cpu,那么就可以真正的达

JavaSE 复习

这里分享一下学JavaSE 用的教材 高宏静的 <Java从入门到精通>,每一章都是一个单独的PDF用来复习JavaSE该是够了. 链接: http://pan.baidu.com/s/1ntyrDMx 密码: 6htz

个人JAVASE复习笔记

集合 6.28 Arraylist 使用迭代器遍历的时候不能操作  目标 (改变集合元素的个数)除非特有方法,迭代器中提供的方法 其他遍历正在进行时也  尽量不要去操作目标,容易出错 java.util.ConcurrentModificationException (并发修改异常) 中途了解 迭代器 原理以及源码 个人解决  使用了 toArray() 转成 数组操作 (也许以后有更好的方法 期待) 6.29因此 了解到了  并发容器 COW , 6.30还有 线程安全的List list =

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

JavaSE复习日记 : java包机制

这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; package com.jaovo.webTeah.db; /* * Java包机制 * * 也就是软件包机制,软件世界中的两大难题:命名和缓存; * * 在程序命名中取一个言简意赅的名字很难,有时候名字取出来发现这个名字已经存在,包括IP,域名,MAC地址冲突等,在计算机中都出现了命名冲突的问题,

JavaSE复习日记 : 条件判断语句

/* 条件控制语句:if(){}else{} 语法: 第一种结构:有不执行的情况 if(boolean表达式){ //第一位真,就执行里面的语句,为假就不执行 java语句; } 第二种结构: if(boolean表达式){ java语句; }else{ java语句; } 第三种结构:多个条件判别式,有不执行情况 if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else if(boolean表达式){ java语句; }else i

JavaSE复习总结之集合(Collection)

Java早期版本只给集合类库提供了很少的一组类,但是随着Java版本的升级,Java集合类库越来越充实.集合类库里面存放的,是各式各样的数据容器,我们基本都学过数据结构这门课,数据结构所讲的就是ADT(抽象数据模型)的部分,数据结构不是针对于某一门语言,它所讲的通常是对各语言都通用的ADT部分,ADT和具体实现是没有关系的.但是根据教材.根据各专业的不同,各专业会选用使用不同编程语言实现的教材.而我们所讲的,就是如何使用Java数据容器,即Java集合(用Java实现的ADT),具体的实现部分,

JavaSE复习日记 : 抽象类

/* * 抽象类 * 抽象: * 面向对象的三大核心思想; * 封装: 封装,ppp是封装的一部分 * 继承; * 多态: 父类的引用指向子类的对象 * 引用: 是指一个引用型变量 * 有哪些变量? * 成员变量; * 构造方法的局部变量; * 普通方法的局部变量; * 立马声明立马使用的变量; * 静态变量; * 什么是抽象类? * 就是用abstract关键字修饰的类就叫抽象类; * 什么是抽象方法? * 没有方法体的方法叫抽象方法,连{}都没有;抽象方法必须在修饰符列表中加上abstrac

JavaSE复习日记 : 接口

/* * 接口 * 引用数据类型: * 类,接口,数组; * * 接口是一种引用数据类型,可以看作是一个特殊的类,它存在的目的是为了解决没有多重继承引起的功能弱的问题而设计的,一个类只能有一个父类,但是这个类却可以实现多个接口; * * 接口还可以看作是只有抽象方法的类,即接口的所有方法都必须被实现; * 接口声明的关键字是interface,代替了class;而普通类的继承关键字extends也变成了implements(实现); * 但是其作用和普通类中是一样的,只不过是为了区分而已; *