day05-继承、方法的重写、super、多态、object类、包装类、native

本文详细介绍了Java中的继承机制,包括减少代码冗余、提高复用性等优点,以及如何通过重写方法实现多态特性。此外还讨论了super关键字的使用、对象的多态性、方法的重载与重写区别,最后介绍了Java中Object类的重要方法。

1.继承

继承的作用:

继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了关系,提供了多态的前提。

2.重写(override/overwrite)

要求
1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
        子类不能重写父类中声明为private权限的方法
4. 子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为非static(即为重写),或者同时声明为
static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
静态方法只能重写静态方法

3.super

super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器
注:当调用构造器时:
子类中所有的构造器默认都会访问父类中空参数的构造器
当父类中没有空参数的构造器时,子类的构造器必须通过this(数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一,且必须放在构造器的首行
如果子类构造器中既未显式调用父类或本类的构造器,且父类中又 没有无参的构造器,则编译出错

4.多态

 对象的多态性:父类的引用指向子类的对象

例:Person p = new Student();  此时Person类型的p指向的子类Student类型的对象

1.一个引用类型变量如果声明为父类的类型,但实际引用的是子类 对象,那么该变量就不能再访问子类中添加的属性和方法
Student m = new Student();
m.school = “pku”;
//合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”;
//非法,Person类没有school成员变量
属性是在编译时确定的,编译时ePerson类型,没有school成员变量,因而编译错误。
2.方法声明的形参类型为父类类型,可以使用子类的对象作为实参调用该方法
public class Test {
public void method(Person e) {
// ……
e.getInfo();
}
public static void main(Stirng args[]) {
Test t = new Test();
Student m = new Student();
t.method(m); // 子类的对象m传送给父类类型的参数e
}
}
3.虚拟方法调用(多态情况下)
子类中定义了与父类同名同参数的方法(重写父类方法),在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
Person e = new Student();
e.getInfo();
//调用Student类的getInfo()方法
编译时类型和运行时类型
编译时ePerson类型,而方法的调用是在运行时确定的,所以调用的是StudentgetInfo()方法。——动态绑定

重载:overload 方法名相同,参数不同----早绑定、静态绑定

多态重写:overwrite 方法名相同,参数相同--- 晚绑定、动态绑定  只有在调用方法的那一刻,解释器才知道调用的是哪个方法


多态小结:

多态作用:
提高了代码的通用性,常称作接口重用
前提:
需要存在继承或者实现关系
有方法的重写
成员方法:
编译时:要查看引用变量所声明的类中是否有所调用的方法。
运行时:调用实际new的对象所属的类中的重写方法。
成员变量:
不具备多态性,只看引用变量所声明的类。


5.Object类

1 public Object()                         构造器
2 public boolean equals(Object obj)                 对象比较
3 public int hashCode()                                  取得Hash码
4 public String toString()                                 对象打印时调用
一、重点说一下equals和==方法区别:
==:
1.基本类型比较值:只要两个变量的值相等,即为true
2.引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true
3.“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本 数据类型除外),否则编译出错
equals:
1.equals():所有类都继承了Object,也就获得了equals()方法。还可以重写。
2.只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
3.特例:当用equals()方法进行比较时,对类FileStringDate及包装类
Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对 象;
原因:在这些类中重写了Object类的equals()方法。
4. 当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都 相等


二、 toString方法:

toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。
在进行String与其它类型数据的连接操作时,自动调用toString()方法
Date now=new Date();
System.out.println(“now=”+now); 相当于
System.out.println(“now=”+now.toString());
可以根据需要在用户自定义类型中重写toString()方法 String 类重写了toString()方法,返回字符串的值。
s1=“hello”;
System.out.println(s1);//相当于System.out.println(s1.toString());
基本类型数据转换为String类型时,调用了对应包装类的toString()方法
int a=10; System.out.println(“a=”+a);
public void test(){
        Date now=new Date();
        System.out.println("now="+now); //相当于 now=Fri Jan 21 15:11:38 CST 2022
        System.out.println("now="+now.toString());

        Object o  =new Object();
        System.out.println(o.toString());//java.lang.Object@1f021e6c
    }


public void test1() {
        char[] arr = new char[] { 'a', 'b', 'c' };
        System.out.println(arr);//abc
        int[] arr1 = new int[] { 1, 2, 3 };
        System.out.println(arr1);//[I@22eeefeb
        double[] arr2 = new double[] { 1.1, 2.2, 3.3 };
        System.out.println(arr2);//[D@17d0685f
    }

6.包装类

 装箱  基本类型->包装类

例:int i =5;  Integer t = new Integer(i);//已过时  或者   Float f = new Float(“4.56”);

拆箱  包装类->基本类型

例:int j = t.intValue();   //t是上面包装类那个t

基本类型->String

例:String str = String.valueOf(2);   或者  String str = 2+“”;

String->基本类型

例:int i = new Integer("2");  或者   Integer i = Integer.parseInteger("2");

@Test
    public void test3(){
        Object o1 = true ? new Integer(1) : new Double(2.0);
        System.out.println(o1);//1.0,三目运算符自动类型转换

        Object o2;
        if (true)
            o2 = new Integer(1);
        else
            o2 = new Double(2.0);
        System.out.println(o2);//1
    }

7.native

native 关键的理解
使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++等非 Java 语言实现的,并且被编译成了 DLL,由 java 去调用。
(1)为什么要用 native 方法
java 使用起来非常方便,然而有些层次的任务用 java 实现起来不容易,或者我们 对程序的效率很在意时,问题就来了。例如:有时 java 应用需要与 java 外面的 环境交互。这是本地方法存在的主要原因,你可以想想 java 需要与一些底层系 统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制: 它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁 琐的细节。
(2)native 声明的方法,对于调用者,可以当做和其他 Java 方法一样使用 一个 native method 方法可以返回任何 java 类型,包括非基本类型,而且同样可 以进行异常控制。 native method 的存在并不会对其他类调用这些本地方法产生任何影响,实际上 调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM 将控制调用 本地方法的所有细节。
如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用 java 语言重写这个方法(如果需要的话)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值