1.OOP特征二:继承性

image.png

image.png
image.png

  1. package day11;
  2. /*
  3. *面向对象的特征之二:继承性 why?
  4. *
  5. * 一、继承性的好处:
  6. * ①继承的出现减少了代码冗余,提高了代码的复用性。
  7.  ②继承的出现,更有利于功能的扩展。
  8.  ③继承的出现让类与类之间产生了关系,提供了多态的前提。
  9. *
  10. * 二、继承性的格式:class A extends B{}
  11. * A:子类、派生类、subclass
  12. * B:父类、超类、基类、superclass
  13. *
  14. * 2.1 体现:一旦子类A继承父类B以后,子类A就获取了父类B中的声明的所有的属性、方法
  15. * 2.2 子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的扩展
  16. * 子类和父类的关系,不同于子集和集合的关系
  17. *
  18. * 三、Java继承性的一些规定
  19. * 3.1Java只支持单继承和多层继承,不允许多重继承
  20.  3.2一个子类只能有一个父类
  21.  3.3一个父类可以派生出多个子类
  22.  class SubDemo extends Demo{ } //ok
  23.  class SubDemo extends Demo1,Demo2...//error
  24. 3.4 子类直接继承的父类,称之为:直接父类。间接继承的父类称之为:间接父类
  25. 3.5 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
  26. 四、1.如果我们没有显式的声明一个类的父类的话,则此类继承与java.lang.Object类
  27. 2.所有的java类(除java.lang.Object类之外)都直接或间接继承于java.lang.Object类
  28. */
  29. public class ExtendsTest {
  30. public static void main(String[] args) {
  31. Person p1=new Person();
  32. p1.age=18;
  33. p1.eat();
  34. Student s1=new Student();
  35. s1.eat();
  36. s1.sleep();
  37. }
  38. }

2.方法的重写(override)

image.png

image.png

3.四种访问权限修饰符

image.png

4.关键字:super

image.png
image.png
image.png
image.png
image.png

5.子类对象实例化过程

image.png
image.png

6.OOP特征三:多态性

image.png

多态性方法的使用

image.png
image.png
image.png
image.png
image.png
多态性是一个编译时行为还是一个运行时行为?
答案:多态性是一个运行时行为!
image.png
image.png

7.Object类的使用

  1. package atguigu.java;
  2. /*
  3. * java.lang.Object类
  4. * 1.object类是所有Java类的根父类
  5. * 2.如果在类的声明中未使用extends关键字指明其父类,则其默认父类就是java.lang.Object类
  6. * 3.Object类中的功能(属性、方法)就具有通用性
  7. * 属性:无
  8. * 方法:equals()\ tostring() \getclass() \hashCode()\clone() \finalize()
  9. * wait()\ notify()
  10. *
  11. *
  12. *
  13. */
  14. public class ObjectTest {
  15. public static void main(String[] args) {
  16. Order order =new Order();
  17. System.out.println(order.getClass().getSuperclass());
  18. }
  19. }
  20. class Order{
  21. }

7.1 Equals方法

  1. package atguigu.java;
  2. /*
  3. * 面试题:==和equals()的区别
  4. *
  5. * 一、回顾==的使用
  6. * ==:运算符
  7. * 1.可以使用在基本数据类型变量和引用数据类型变量中
  8. * 2.如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等(不一定类型相同)
  9. * 如果比较的是引用数据类型变量,比较两个数据的地址值
  10. *
  11. * 二、equals()方法的使用
  12. * 1.是一个方法,而非运算符
  13. * 2.只能适用于引用数据类型
  14. * 3.Object类中equals的定义:
  15. * public boolean equals(Object obj){
  16. * return (this == obj);
  17. * }
  18. * 说明:Object类中定义的equals()和==的作用是相同的,
  19. * 比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
  20. *
  21. */
  22. public class EqualsTest {
  23. public static void main(String[] args) {
  24. int i=10;
  25. int j=10;
  26. double d=10.0;
  27. System.out.println(i==j);//true
  28. System.out.println(i==d);//true
  29. char c=10;
  30. System.out.println(i==c);//true
  31. char c1=65;
  32. char c2='A';
  33. System.out.println(c1==c2);//true
  34. Customer cust1 =new Customer("Tom",21);
  35. Customer cust2 =new Customer("Tom",21);
  36. System.out.println(cust1 ==cust2); //false
  37. String str1=new String("shangguigu");
  38. String str2=new String("shangguigu");
  39. System.out.println(str1==str2); //false
  40. System.out.println("*********************");
  41. System.out.println(cust1.equals(cust2));//false
  42. System.out.println(str1.equals(str2));//true
  43. //任何情况下,x.equals(null)的返回值永远是false
  44. System.out.println("**********************");
  45. System.out.println(cust1.equals(null));
  46. }
  47. }

7.2 ToString方法

  1. package atguigu.java;
  2. import java.util.Date;
  3. /*
  4. *Object类中toString的使用
  5. *
  6. * 1.当我们输出一个对象的引用时,实际上就是调用当前对象的tostring()
  7. *
  8. * 2.Object类中toString()的定义:
  9. * public String toString() {
  10. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  11. }
  12. *
  13. *
  14. * 3.像String date file 包装类等都重写了object类中的tostring()方法
  15. * 使得在调用对象的tostring()时,返回"实体内容"信息
  16. *
  17. * 4.自定义类也可以重写tostring()方法
  18. *
  19. */
  20. public class ToString {
  21. public static void main(String[] args) {
  22. Customer cust1 =new Customer("Tom",21);
  23. System.out.println(cust1); //atguigu.java.Customer@15db9742
  24. System.out.println(cust1.toString()); //atguigu.java.Customer@15db9742
  25. String str =new String("MM");
  26. System.out.println(str); //MM
  27. Date date =new Date(127836217836l);
  28. System.out.println(date.toString());//Sat Jan 19 22:03:37 CST 1974
  29. }
  30. }

7.3 JUnit独立单元测试的使用

  1. package atguigu.java2;
  2. import java.util.Date;
  3. import org.junit.Test;
  4. import org.omg.CORBA.PUBLIC_MEMBER;
  5. /*
  6. * Java中的JUnit单元测试
  7. *
  8. * 步骤:
  9. * 1.选中当前工程- 右键选择:build path -add libraries -JUnit 4 -下一步
  10. * 2.创建一个java类进行单元测试。
  11. * 此时的java类要求:1.此类是public的 2.此类提供公共的无参的构造器
  12. * 3.此类中声明单元测试方法。
  13. * 此时的单元测试方法,方法的权限是public,没有返回值,没有形参
  14. *
  15. * 4.此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org。JUnit。Test
  16. *
  17. * 5.声明好单元测试方法以后,就可以在方法体内测试相关代码
  18. *
  19. * 6.写完代码以后,左键双击单元测试方法名,右键:run as -JUnit
  20. *
  21. * 说明:
  22. * 1.如果执行结果没有任何异常:绿条
  23. * 2.如果执行结果出现异常:红条
  24. */
  25. public class JUunitTtest {
  26. @Test
  27. public void testEquals(){
  28. String s1 = "MM";
  29. String s2 = "MM";
  30. System.out.println(s1.equals(s2));
  31. //ClassCastException的异常
  32. // Object obj =new String("GG");
  33. // Date date =(Date)obj;
  34. }
  35. }

8.包装类的使用

需要了解的是基本数据类形、包装类、string三者之间的相互转换

image.png

image.png

  1. package atguigu.java2;
  2. import java.lang.reflect.Method;
  3. import org.junit.Test;
  4. /*
  5. *包装类的使用:
  6. * 1.Java提供了8中基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
  7. *
  8. * 2.掌握的:基本数据类形、包装类、string三者之间的相互转换
  9. *
  10. *
  11. *
  12. */
  13. public class WrapperTest {
  14. //String类型----->基本数据类型、包装类:调用包装类的parseXxx()
  15. @Test
  16. public void test5(){
  17. String str1="123";
  18. //错误:要想进行强制类型转换,前提是两者有子父类关系
  19. // int num1=(int)str1;
  20. // Integer in1=(Integer)str1;
  21. //可能会报错:NumberFormateException
  22. int num2=Integer.parseInt(str1);
  23. System.out.println(num2+1);
  24. String str2="true1";
  25. boolean b1=Boolean.parseBoolean(str2);
  26. System.out.println(b1); //false
  27. }
  28. //基本数据类型、包装类----->String类型 :调用String重载的valueof(Xxx xxx)
  29. @Test
  30. public void test4(){
  31. int num1=10;
  32. //方式一:连接运算
  33. String str1 =num1 +"";
  34. //方式二:调用String的valueof(Xxx xxx)
  35. float f1 =12.3f;
  36. String str2 =String.valueOf(f1);//"12.3"
  37. Double d1=new Double(12.4);
  38. String str3 =String.valueOf(d1);//"12.4"
  39. System.out.println(str2);
  40. System.out.println(str3);
  41. }
  42. //*******************************************************
  43. /*
  44. *JDK 5.0新特性:自动装箱和拆箱
  45. *
  46. */
  47. @Test
  48. public void test3(){
  49. // int num1 =10;
  50. // //基本数据类形--->包装类的对象
  51. // Method(num1);
  52. //自动装箱:基本数据类型--->包装类
  53. int num2=10;
  54. Integer in1=num2;//自动装箱
  55. boolean b1=true;
  56. Boolean b2=b1; //自动装箱
  57. //自动拆箱:包装类--->基本数据类型
  58. System.out.println(in1.toString());
  59. int num3=in1;//自动拆箱
  60. }
  61. public void Method(Object obj){
  62. System.out.println(obj);
  63. }
  64. //*******************************************************
  65. //包装类--->基本数据类型:调用包装类的xxxValue()
  66. @Test
  67. public void test2(){
  68. Integer in1 =new Integer(12);
  69. int i1=in1.intValue();
  70. System.out.println(i1+1);
  71. Float f1 =new Float(12.3);
  72. float f2=f1.floatValue();
  73. System.out.println(f2+2);
  74. }
  75. //*******************************************************
  76. //基本数据类型--->包装类:调用包装类的构造器
  77. @Test
  78. public void test1(){
  79. int num1=10;
  80. Integer in1=new Integer(num1);
  81. System.out.println(in1.toString());
  82. Integer in2=new Integer("123");
  83. System.out.println(in2.toString());
  84. //报异常,只有string是纯数字的时候才可以使用
  85. // Integer in3=new Integer("abc123");
  86. // System.out.println(in3.toString());
  87. Float f1=new Float(12.3);
  88. Float f2=new Float(12.3f);
  89. System.out.println(f1);
  90. System.out.println(f2);
  91. Boolean b1 =new Boolean(true);
  92. Boolean b2 =new Boolean("tRuE");//true,不区分大小写
  93. Boolean b3 =new Boolean("true123");//false
  94. System.out.println(b3);
  95. }
  96. }