30天搞定Java--day13

文章目录

  • 每日一考和复习
  • 面向对象
    • 面向对象特征之三:多态性(接day12)
      • 对象类型转换
      • instanceof
      • 多态性经典题目
    • Object类的使用
      • ==和equals方法的区别
      • Object类中toString()的使用:
    • 包装类的使用

每日一考和复习

每日一考

  1. 什么是多态性?什么是虚拟方法调用?
多态性:父类的引用指向子类的对象
虚拟方法调用:编译看左,运行看右
  1. 一个类可以有几个直接父类?一个父类可有多少个子类?子类能获取直接父类的父类中的结构吗?子类能否获取父类中private权限的属性或方法?
一个类可以有一个直接父类
一个父类可以有多个子类
子类能获取直接父类的父类中的结构
子类能获取父类中private权限的属性或方法
  1. 方法的重写(override/overwrite)的具体规则有哪些?
方法名、参数列表相同
子类方法权限小于等于父类方法
子类的返回类型必须是父类方法返回类型的子类或与其相同
  1. super调用构造器,有哪些具体的注意点
须放在构造器的首行
参数列表和父类中定义的相同

复习
day12的学习内容

面向对象

面向对象特征之三:多态性(接day12)

对象类型转换

Man是Person的子类,Person person = new Man()person不能调用Man中有而Person类没有的方法,此时若需调用需要强制类型转换(向下转型)Man man = (Man) person

向上转型就是多态

强制类型转换会出现问题,可能会报错java.lang.ClassCastException这是由转换类型错误造成的

instanceof

a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false

为了避免在向下转型时出现java.lang.ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型

多态性经典题目

package com.atguigu.exer;

//考查多态的笔试题目:
public class InterviewTest1 {

	public static void main(String[] args) {
		Base1 base = new Sub1();
		base.add(1, 2, 3);   // sub_1

		Sub1 s = (Sub1) base;
		s.add(1, 2, 3);      // sub_2

	}
}

class Base1 {
	public void add(int a, int... arr) {
		System.out.println("base1");
	}
}

class Sub1 extends Base1 {

	public void add(int a, int[] arr) {
		System.out.println("sub_1");
	}

	public void add(int a, int b, int c) {
		System.out.println("sub_2");
	}
}

base开始的时候只能调用Base1类中有的方法(编译看左),只有两种可能(输出sub_1或者编译过不了),如果认为输出base1建议多看看多态;在这里认为子类中的方法重写了父类中的方法

Object类的使用

  • Object类是所有Java类的根父类
  • 如果在类的声明中未使用extends关键字指明其父类,则默认父类 为java.lang.Object类

==和equals方法的区别

一、== :运算符

  1. 可以使用在基本数据类型变量和引用数据类型变量中
  2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同;即两个引用是否指向同一个对象实体
    补充: == 符号使用时,必须保证符号左右两边的变量类型一致。

二、equals()方法的使用:
3. 是一个方法,而非运算符
4. 只能适用于引用数据类型
5. Object类中equals()的定义:

public boolean equals(Object obj) {
    return (this =\= obj);
}
 说明:```Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同;即两个引用是否指向同一个对象实体```
  1. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。

  2. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们 就需要对Object类中的equals()进行重写。
    重写的原则:比较两个对象的实体内容是否相同。

Object类中toString()的使用:

  1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()

  2. Object类中toString()的定义:

    publicString toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
  3. 像String、Date、File、包装类等都重写了Object类中的toString()方法。
    使得在调用对象的toString()时,返回"实体内容"信息

  4. 自定义类也可以重写toString()方法,当调用此方法时,返回对象的"实体内容"

包装类的使用

  • 针对八种基本数据类型定义相应的引用类型—包装类(封装类)
  • 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
  • 基本数据类型包装成包装类的实例 —装箱
    通过包装类的构造器实现:
int i = 500; 
Integer t = new Integer(i);
  • 还可以通过字符串参数构造包装类对象:
Float f = new Float(4.56);
  • 获得包装类对象中包装的基本类型变量 —拆箱
    调用包装类的.xxxValue()方法:
boolean b = bObj.booleanValue();

JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配

@Test
public void test3() {
	int num1 = 10;
	// 基本数据类型-->包装类的对象
	method(num1);

	// 自动装箱:基本数据类型 --->包装类
	int num2 = 10;
	Integer in1 = num2;// 自动装箱

	boolean b1 = true;
	Boolean b2 = b1;// 自动装箱

	// 自动拆箱:包装类--->基本数据类型
	System.out.println(in1.toString());

	int num3 = in1;// 自动拆箱
}

包装类和字符串相互转化

//String类型 --->基本数据类型、包装类:调用包装类的parseXxx(String s)
@Test
public void test5(){
	String str1 = "123";
	int num2 = Integer.parseInt(str1);
	System.out.println(num2 + 1);
	
	String str2 = "true1";
	boolean b1 = Boolean.parseBoolean(str2);
	System.out.println(b1);
}

//基本数据类型、包装类--->String类型:调用String重载的valueOf(Xxx xxx)
@Test
public void test4(){
	
	int num1 = 10;
	//方式1:连接运算
	String str1 = num1 + "";
	//方式2:调用String的valueOf(Xxx xxx)
	float f1 = 12.3f;
	String str2 = String.valueOf(f1);//"12.3"
}

包装类经典题目

@Test
public void test3() {
	Integer i = new Integer(1);
	Integer j = new Integer(1);
	System.out.println(i == j);//false
	
	//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
	//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
	//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
	
	Integer m = 1;
	Integer n = 1;
	System.out.println(m == n);//true

	Integer x = 128;//相当于new了一个Integer对象
	Integer y = 128;//相当于new了一个Integer对象
	System.out.println(x == y);//false
}

你可能感兴趣的:(#,30天搞定Java)