Java面向对象

您所在的位置:网站首页 tostring方法重载 Java面向对象

Java面向对象

2023-05-02 01:36| 来源: 网络整理| 查看: 265

1、方法重写 1.1、意义

当子类继承父类方法,但是父类的方法功能无法满足子类的需求,那就需要在子类重新定义父类的方法,加入子类需要的内容,这种就是方法重写

1.2、方法重写或方法的覆盖(overriding)

1)子类对所继承父类相同方法的一种更改,这个更改需要遵循格式按照父类的格式,访问权限,抛出异常等等,都在父类方法控制范围内,内部具体实现可以实现不同的效果。 2)重写时,可以用super.方法的方式来保留父类的方法 3)构造方法由于类名不同,所以不能被继承,也就不能被重写 4)方法重写的前提是:必须要存在继承的关系。

备注: String字符串的equals方法就是最明显的重写,toString()也是 使用的注解:@override,存在继承关系,可以直接写要重新方法名,自动会带出重写的方法,注意,如果加了注解,代表必须是重写方法

2、方法重写的规则

1)方法重写时,方法名与形参列表必须一致。 2)方法重写时,子类的返回值类型相同或者是其子类,即必须要小于或者等于父类的返回值类型。 3)方法重写时,子类的权限修饰符不能严于父类,即要大于或者等于父类的权限修饰符。 4)方法重写时,父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法 5)方法重写时,子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super) 6)方法重写时,父类的私有方法不能被子类覆盖 7)方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型。

参考代码(建议复制到编译软件分析)

这里的pet类我没有给出,cat类是pet的子类

public class Father { /** * 空参,没有返回值 */ public void method1(){ System.out.println("------ 父类Father中的:method1,空参,没有返回值 ------"); } /** * 带参,没有返回值 */ public void method2(String param){ System.out.println("------ 父类Father中的:method2,带参,没有返回值 ------"); } /** * 空参,有返回值 */ public Pet method3(){ System.out.println("------ 父类Father中的:method3,空参,有返回值 ------"); return null; } /** * 带参,有返回值 */ protected Pet method4(String param){ System.out.println("------ 父类Father中的:method4,空参,有返回值 ------"); return null; } /** * 静态方法 */ public static void method5(){ System.out.println("------ 父类Father中的:method5,静态方法 ------"); } /** * 非静态方法 */ public void method6(){ System.out.println("------ 父类Father中的:method6,非静态方法 ------"); } /** * 私有方法 */ /*private void method7(){ System.out.println("------ 父类Father中的:method7,私有方法 ------"); } */ /** * 抛出异常方法 * @throws NullPointerException */ /*public void method8() throws NullPointerException{ System.out.println("------ 父类Father中的:method8,抛异常方法 ------"); }*/ } public class Son extends Father{ // 1 方法名相同 @Override public void method1(){ System.out.println("------ 子类Son中的:method1,空参,没有返回值 ------"); } // 方法名不同,不是重写的方法 /*@Override public void methodOne(){ System.out.println("------ 子类Son中的:methodOne,空参,没有返回值 ------"); }*/ // 2 参数列表相同 @Override public void method2(String param) { System.out.println("------ 子类Son中的:method2,带参,没有返回值 ------"); } // 类型不同 /*@Override public void method2(boolean param) { System.out.println("------ 子类Son中的:method2,带参,没有返回值 ------"); }*/ // 个数不同 /*@Override public void method2(String param1, String param2) { System.out.println("------ 子类Son中的:method2,带参,没有返回值 ------"); }*/ // 3 返回值类型只能父类返回值类型或者是其子类类型 @Override public Pet method3() { System.out.println("------ 子类Son中的:method3,空参,有返回值 ------"); return null; } /*@Override public Cat method3() { System.out.println("------ 子类Son中的:method3,空参,有返回值 ------"); return null; }*/ // 父类返回值类型父类 /*@Override public Object method3() { System.out.println("------ 子类Son中的:method3,空参,有返回值 ------"); return null; }*/ // 父类返回值类型不同 /*@Override public String method3() { System.out.println("------ 子类Son中的:method3,空参,有返回值 ------"); return null; }*/ // 4 修饰符不能严于父类 @Override protected Pet method4(String param) { System.out.println("------ 子类Son中的:method4,带参,有返回值 ------"); return null; } /*@Override public Pet method4(String param) { System.out.println("------ 子类Son中的:method4,带参,有返回值 ------"); return null; }*/ // 修饰符严于父类 /*@Override Pet method4(String param) { System.out.println("------ 子类Son中的:method4,带参,有返回值 ------"); return null; }*/ // 5 父类的静态方法,不能被子类重写为非静态方法 /*public void method5(){ System.out.println("------ 子类Son中的:method5,静态方法 ------"); }*/ // 6 父类的非静态方法,不能被子类重写为静态方法 /*public static void method6(){ System.out.println("------ 子类Son中的:method6,非静态方法 ------"); }*/ // 7 子类可以定义与父类同名的静态方法,以便在子类中,隐藏父类的静态方法 // @Override 不可以使用重写注解,编译报错 public static void method5(){ // super(); // 语法限制:静态方法中不能使用super System.out.println("------ 子类Son中的:method5,静态方法 ------"); } // 8 子类不能重写父类的私有方法 /*@Override public void method7(){ System.out.println("------ 子类Son中的:method7,私有方法 ------"); }*/ // 9 子类不能抛出比父类方法更多的异常(范围不能大于父类中的异常) /*@Override public void method8() throws Exception{ System.out.println("------ 父类Father中的:method8,抛异常方法 ------"); }*/ public static void main(String[] args) { // 调用子类中和父类同名的静态方法 Son.method5(); } } 3、方法重载和方法重写的异同 比较项 位置 方法名 参数列表 返回值 修饰符 重写 子类 相同 相同 相同或者子类 不能严于父类 重载 同类 相同 不同 无关 无关 4、Object类

所有类的父类,如果没有使用extends关键字指定基类,那默认是继承object类

object类经常被重写的方法

toString(); 返回当前对象本身的有关信息,按字符串对象返回 equals(); 比较两个对象是否是同一个对象,是则返回true

重点关注equals方法和toString方法的重写

Object的equals方法 比较的是两个对象是不是同一个对象,是则返回true 操作符 == 对于简单数据类型,比较的是值,如果是引用内容,两者比较的是是否为同一个对象 由此看出 object的equals跟 == 的效果是一样的 当有特殊需求时候,如认为属性值相同即为同一个对象,那就要重写equals方法 平时使用过String类的equals方法,那这个就是重写过equals方法的

5、多态

没使用多态的弊端:

频繁修改代码,代码的扩展性、可维护性差 同一个方法,可能需要针对不同的类型参数,重复定义

定义:

同一个行为,具有多个不同形式的表现或者能力

三个必要条件:

1、继承--存在继承关系 2、重写--子类重写父类的方法(通过父类调用子类的同名方法) 3、父类引用对象指向子类的实例(对象)

向上转型:

父类的引用指向子类的实例,类型自动转换 语法: 父类 对象名 = new 子类对象();

向下转型:

将一个指向子类对象的父类,强转为子类对象 语法: 子类 对象名 = (子类)父类的引用变量 注意: 向下强转时,必须是转换为真实的子类类型,否则会出现转换异常 使用instanceof关键字,判断是否是该子类创建的实例 ( instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。)

实现多态的两种形式:

1)父类作为方法形式参数 2)父类作为方法的返回值

父类指向子类对象时:

注意: 1)通过父类引用变量调用的方法是子类覆盖的方法 2)通过父类引用变量调用的方法是子类未覆盖的,调用的是从父类继承的旧方法 3)通过父类引用变量无法调用子类特有的方法(父类没有该方法,所以调用不到) 4)属性也类似 (能点出来什么,是看引用的类型。)

子类引用指向自身对象时:

注意: 1)子类引用变量调用的方法是子类覆盖的方法 2)子类引用变量调用的方法是未覆盖的,实际调用的是从父类继承的旧方法 3)子类引用变量可以调用子类特有的方法 4)属性也类似



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3