大数据--Java面向对象
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对对象属性值进行操作。比如,可以将类中属性私有化。继承是发生在两个类之间,一个类继承另一个类是说这个类属于另一个类,具有另一个类的所有属性和方法,同时它还可以有另一个类不具备的方法和属性。比如,定义一个类为账户。多态是建立在继承的基础上的,一个父类对象可以产生多个不同的子类对象,根据这些子类对象的不同可以具备不同的方法,也就是说表现出了不同的形态即多态。
* 1. java.lang.Object是所有其他java类的根父类
* 内部声明的方法具有通用性。
*
* 2. clone():可以看做是创建Java中对象的第二种方式
* 3. finalize():当垃圾回收器在回收对象前,对象会调用此方法。
面试题:final \ finally \ finalize 三者的区别
4. hashCode():放到后面集合内容讲解
5. wait() / notify() / notifyAll() :放到后面线程通信时讲解
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(): 适用于引用数据类型。
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 }
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 }
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 }
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 }


浙公网安备 33010602011771号