大数据--Java面向对象

知识点1:多态的理解

开发中多态的常见场景

 1 public static void main(String[] args) {
 2         //开发中很少见的多态场景
 3         Person p1 = new Man();
 4 
 5         System.out.println(p1.id);//属性不存在多态性
 6 
 7         p1.eat();
 8 
 9 //        p1.earnMoney();
10 
11 
12         PersonTest test = new PersonTest();
13         test.method(new Man());//开发中常见的多态的场景
14 }
15 
16 public void method(Person p) { //Person p = new Man();
17         p.eat();
18         p.walk();
19         System.out.println(p.id);
20 }

有了多态之后,编译、运行中出错的情况展示

 1 //###########更多的开发常见问题###################
 2         //编译不通过
 3 //        Woman w1 = (Woman)new Man();
 4 //        String str = new Date();
 5 
 6         //编译通过,运行不通过
 7 //        Person p2 = new Man();
 8 //        Woman w2 = (Woman)p2;
 9 
10 //        Object obj = new Date();
11 //        String str = (String)obj;
12 
13         Person p2 = new Person();
14         Man m2 = (Man) p2;
15 
16         //编译通过,运行也通过
17         Object obj = new Man();
18         Person p3 = (Person) obj;
19         p3.eat();

面试题:如何理解面向对象的三大特征?

使用自己的语言组织

尽量多举开发中的例子

封装性就是把普通的对象进行封装,对象的属性设为私有的,对外提供get和set方法,其他类只能通过get和set对对象属性值进行操作。比如,可以将类中属性私有化。继承是发生在两个类之间,一个类继承另一个类是说这个类属于另一个类,具有另一个类的所有属性和方法,同时它还可以有另一个类不具备的方法和属性。比如,定义一个类为账户。多态是建立在继承的基础上的,一个父类对象可以产生多个不同的子类对象,根据这些子类对象的不同可以具备不同的方法,也就是说表现出了不同的形态即多态。

知识点2:Object类

1. 理解

* 1. java.lang.Object是所有其他java类的根父类
* 内部声明的方法具有通用性。
*
* 2. clone():可以看做是创建Java中对象的第二种方式
* 3. finalize():当垃圾回收器在回收对象前,对象会调用此方法。
面试题:final \ finally \ finalize 三者的区别
4. hashCode():放到后面集合内容讲解
5. wait() / notify() / notifyAll() :放到后面线程通信时讲解

2. equals()的使用

java.lang.Object类的equals()的使用
*
* 1. java.lang.Object类中equals()的声明:
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 说明:Object类中的equals()是比较两个对象的地址值是否相同。(或比较两个引用是否指向堆空间中的同一个对象)
*
* 2. 像String\File\Date类等都重写了Object类中的equals()。重写的规则:
* 比较两个对象的属性值是否都相等。
*
* 3. 自定义类在没有重写Object类的equals()前,比较的都是两个引用的地址值是否相等。
* 但是一般开发中,凡是调用了equals(),都是想比较两个对象的实体内容是否相等。则意味着我们
* 要重写equals().

举例

 1 public class Order {
 2     private String orderName;
 3     private int orderId;
 4 
 5     public String getOrderName() {
 6         return orderName;
 7     }
 8 
 9     public void setOrderName(String orderName) {
10         this.orderName = orderName;
11     }
12 
13     public int getOrderId() {
14         return orderId;
15     }
16 
17     public void setOrderId(int orderId) {
18         this.orderId = orderId;
19     }
20 
21     public Order(String orderName, int orderId) {
22         this.orderName = orderName;
23         this.orderId = orderId;
24     }
25 
26     public Order() {
27     }
28 
29     //手动重写equals():比较两个对象的实体内容是否相等。
30 //    @Override
31 //    public boolean equals(Object obj) {
32 //        System.out.println("Order equals()....");
33 //        if (this == obj) {
34 //            return true;
35 //        }
36 //        if (obj instanceof Order) {
37 //            Order order = (Order) obj;
38 //            //比较当前Order对象this与order对象的实体内容
39 ////            if(this.orderId == order.orderId && this.orderName.equals(order.orderName)){
40 ////                return true;
41 ////            }else{
42 ////                return false;
43 ////            }
44 //            //可以写为:
45 //            return this.orderId == order.orderId && this.orderName.equals(order.orderName);
46 //        }
47 //
48 //        return false;
49 //
50 //    }
51 
52     //自动生成的equals()
53     @Override
54     public boolean equals(Object o) {
55         if (this == o) return true;
56         if (o == null || getClass() != o.getClass()) return false;
57 
58         Order order = (Order) o;
59 
60         if (orderId != order.orderId) return false;
61         return orderName != null ? orderName.equals(order.orderName) : order.orderName == null;
62     }
63     
64 }

面试题:

面试题: == 和 equals() 的区别?
1. == : 运算符,适用于基本数据类型(比较两个数据的值是否相等)、引用数据类型(比较两个引用是否指向堆空间中的同一个对象)
2. equals(): 适用于引用数据类型。

3. toString()的使用

1. Object类中toString()的定义:
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* }
* 2. 当我们没有重写Object类中的toString()方法时,当输出对象的引用时,默认调用Object类
* 中的toString()方法,输出对象的地址值。
*
* 3. 像String\日期Date\File类等类型都重写了Object类中的toString()方法,返回其内部的
* 实体内容。
*
* 4. 如果我们希望调用自定义类的toString()时,希望返回其内部实体内容。则需要进行重写。
*

举例

 

 1 package com.atguigu.java1;
 2 
 3 /**
 4  * @author shkstart
 5  * @create 2020-07-07 10:42
 6  */
 7 public class Order {
 8     private String orderName;
 9     private int orderId;
10 
11     public String getOrderName() {
12         return orderName;
13     }
14 
15     public void setOrderName(String orderName) {
16         this.orderName = orderName;
17     }
18 
19     public int getOrderId() {
20         return orderId;
21     }
22 
23     public void setOrderId(int orderId) {
24         this.orderId = orderId;
25     }
26 
27     public Order(String orderName, int orderId) {
28         this.orderName = orderName;
29         this.orderId = orderId;
30     }
31 
32     public Order() {
33     }
34 
35     //手动生成的:
36 //    public String toString() {
37 //        return "Order[orderName : " + orderName + ",orderId : " + orderId + "]";
38 //    }
39 
40     //自动生成的:
41     @Override
42     public String toString() {
43         return "Order{" +
44                 "orderName='" + orderName + '\'' +
45                 ", orderId=" + orderId +
46                 '}';
47     }
48 }

知识点3:包装类的使用

1. 我们为8种基本数据类型提供了对应的8种包装类。目的是为了让基本数据数据类型的变量
* 具备类的特征 ---> 便于一些方法调用时使用。

2. 掌握8种基本数据类型以及对应的包装类。

 

3. 掌握:基本数据类型、包装类、String类三者之间的转换操作

 

测试举例

 1 /*
 2     基本数据类型---> 对应的包装类:
 3 
 4     包装类 ---> 基本数据类型:
 5      */
 6     @Test
 7     public void test1(){
 8         //基本数据类型---> 对应的包装类:调用包装类的构造器
 9         int m = 10;
10         Integer integer1 = new Integer(m);
11         System.out.println(integer1.toString());
12 
13         float f1 = 10.2F;
14         Float float1 = new Float(f1);
15 
16         String s1 = "10.3";
17         Float float2 = new Float(s1);
18         System.out.println(float2.toString());
19 
20         //包装类 ---> 基本数据类型:调用包装类的xxxValue()
21         int j = integer1.intValue();
22         System.out.println(j + 0);
23 
24         float f2 = float2.floatValue();
25 
26     }
27 
28     //JDK5.0引入的新特性:自动的装箱和拆箱
29     @Test
30     public void test2(){
31         int m = 10;
32         Integer int1 = m;//自动装箱
33         Integer int2 = 10;//自动装箱
34         System.out.println(int1.toString());
35 
36         method(10);//自动装箱
37 
38         int n = int1;//自动拆箱
39         int sum = int1 * 20;//自动拆箱
40 
41         test1(int2);//自动拆箱
42     }
43 
44     public void method(Object obj){
45         System.out.println(obj);
46     }
47 
48     public void test1(int i){
49 
50     }
51 
52     /*
53     基本数据类型、包装类 --> String类型:
54     String类型 ---> 基本数据类型、包装类:
55      */
56     @Test
57     public void test3(){
58         //基本数据类型、包装类 --> String类型: ① 调用String重载的valueOf(Xxx xx) ② 连接符:+
59         int num = 10;
60         Float f1 = new Float(10.1);
61 
62         String s1 = String.valueOf(num);
63         String s2 = String.valueOf(f1);
64 
65         System.out.println(s1);
66         System.out.println(s2);
67 
68         String s3 = num + "";
69 
70     }
71 
72     @Test
73     public void test4(){
74         String s1 = "123";
75 //        s1 = "123abc";//会报NumberFormatException
76 //        String类型 ---> 基本数据类型、包装类:调用包装类Xxx的parseXxx()
77         Integer int1 = new Integer(s1);
78 
79         int i = Integer.parseInt(s1);
80 
81         String s2 = "true123";
82         s2 = "TruE";
83         boolean b = Boolean.parseBoolean(s2);
84 
85         System.out.println(i);
86         System.out.println(b);
87 
88     }
89 }

简化为:

JDK5.0引入的新特性:自动的装箱和拆箱.可以实现基本数据类型和包装类之间的转换
基本数据类型、包装类 --> String类型: ① 调用String重载的valueOf(Xxx xx) ② 连接符:+
String类型 ---> 基本数据类型、包装类:调用包装类Xxx的parseXxx()

 

补充说明

 1 class Order{
 2     boolean isMale;
 3     Boolean isMarried;
 4 }
 5 class Account{
 6     double balance;//0.0
 7     Double balance1;//null
 8 }
 9 //测试时:
10 @Test
11     public void test5(){
12         Order order = new Order();
13         System.out.println(order.isMale);//false
14         System.out.println(order.isMarried);//null
15     }

知识点4:单元测试方法

 1 /**
 2  * 单元测试方法的使用
 3  *
 4  * 1. 为什么使用单元测试方法:为了方便的在测试类中针对多个不同的代码或方法单独进行测试。
 5  *
 6  * 2. 如何实现?有什么要求?
 7  *  ① 单元测试方法声明前加上注解: @Test (来自于org.junit.Test)
 8  *  ② 单元测试方法是:public的、无返回值类型的、无形参的方法
 9  *  ③ 单元测试类是public的,提供空参的public权限的构造器
10  *
11  *  如果以上条件不满足,在执行单元测试方法时,报initializationError
12  *
13  * @author shkstart
14  * @create 2020-07-07 15:22
15  */
16 public class JUnitTest { //单元测试类
17 
18     @Test
19     public void test1(){  //单元测试方法
20         System.out.println("hello");
21         int m = 10;
22         int n = 20;
23         System.out.println( m + n);
24     }
25 
26     @Test
27     public void test2(){
28         int m1 = 10;
29         int n1 = 10;
30         System.out.println(m1 == n1);//true
31         int m2 = 65;
32         char c1 = 'A';
33         System.out.println(m2 == c1);//true
34         float f1 = 65.0F;
35         System.out.println(m2 == f1);//true
36     }
37 
38     @Test
39     public void testGet(){
40         int sum = get(10,20);
41         System.out.println(sum);
42     }
43 
44 
45     public int get(int m,int n){
46         return m + n;
47     }
48 
49 }

补充:关于String字符串常量池的使用

 1 public class StringTest {
 2     public static void main(String[] args) {
 3         //通过字面量的方式进行字符串的赋值操作。此时的字符串数据保存在字符串常量池中。
 4         //字符串常量池中,不存在内容相同的字符串。
 5         String s1 = "hello";//字面量赋值的方式
 6         String s2 = "hello";
 7         String s3 = new String("hello");
 8         String s4 = new String("hello");
 9         System.out.println(s1.equals(s2));//true
10 
11 
12         System.out.println(s1 == s2);//true
13         System.out.println(s1 == s3);//false
14         System.out.println(s1 == s4);//false
15         System.out.println(s3 == s4);//false
16 
17     }
18 }

 

posted @ 2020-07-07 18:02  浪子逆行  阅读(5)  评论(0)    收藏  举报