精华内容
下载资源
问答
  • 方法重载方法重写 方法重载用于提高程序的可读性 方法重写用于提供已经由其超类提供的方法的特定实现 方法重载在类内执行 方法重写需要继承到在子类中 在方法重载的情况下,参数必须不同 在方法...
    方法重载方法重写
    方法重载用于提高程序的可读性 方法重写用于提供已经由其超类提供的方法的特定实现
    方法重载在类内执行 方法重写需要继承到在子类中
    在方法重载的情况下,参数必须不同 在方法重写的情况下,参数必须相同
    方法重载是编译时多态性的例子 方法重写/覆盖是运行时多态性的例子
    返回类型任意 子类的方法返回的权限修饰符必须大于等于所覆盖的方法

     

    转载于:https://www.cnblogs.com/xiangyuguan/p/11321659.html

    展开全文
  • java中,子类中包含父类同名的方法,称为方法重写。 规则:两同两小一大 方法名相同、形参列表相同 子类方法的返回值类型需小于等于父类方法的返回值、子类声明抛出的异常需小于等于父类声明抛出的异常 子类方

    1、方法重载(@overload)

    java中,同一个类中出现了相同名字的方法,称为方法重载。

    规则:两同一不同(无其他要求,比如返回值、修饰符等均可相同或不同)

    • 同一个类中、方法名相同
    • 形参列表不同(形参个数不同、形参类型不同)

    在java重载一文中有详细介绍。

    2、方法重写(@override)

    java中,子类中包含与父类同名的方法,称为方法重写。

    规则:两同两小一大

    • 方法名相同、形参列表相同
    • 子类方法的返回值类型需小于等于父类方法的返回值、子类声明抛出的异常需小于等于父类声明抛出的异常
    • 子类方法的访问权限应大于等于父类方法的访问权限
    尤其注意:被重写的方法要么都是类方法、要么都是实例方法,不能一个是类一个是实例
    class Base{
    	public static void info() {
    		//类方法
    	}
    }
    public class t extends Base {
    //方法重写错误,因为在父类中info是类方法,但是子类中是实例方法
    	public void info() {
    	}
    }
    

    如果父类中的方法被private修饰,那么此时子类无法访问该方法,如果在子类中出现与父类相同名字的方法,这不是方法重写,只是在子类中定义了一个新的方法。此时这两个同名的方法可以一个是类方法,一个是实例方法。

    class Base{
    //类方法,并且不能被子类访问
    	private static void info() {
    	}
    }
    public class t extends Base {
    //不是方法重新,只是在子类中定义了一个新的方法
    	public void info() {
    	}
    }
    

    如何在子类中调用被子类重写的父类方法? 使用Super限定

    子类重写了父类的方法,那么子类的对象将无法访问父类中被子类覆盖的方法,但可以使用super(实例方法)、类名(类方法)来调用该父类方法。

    class Base{
    	int age;
    	//父类的info方法
    	public void info() {
    		System.out.println("Hello world");
    	}
    }
    class Sub extends Base{
    	//方法重写
    	public void info() {
    		System.out.println("Hello China");
    	}
    	//子类的新方法,在该方法中,想要调用父类的info方法,因此需要使用super限定,如果没有super,则默认是调用子类的info方法,则输出的是:Hello China
    	public void fun() {
    		super.info();
    	}
    }
    public class t{
    	public static void main(String[] args) {
    		Sub s=new Sub();
    		s.info();
    		s.fun();
    	}
    }
    

    输出结果:Hello China
    Hello world

    展开全文
  • 方法重载(Overload): 1.在同一个类中 2.方法名相同 3.参数的个数或类型不同 4.与方法的返回类型无关 5.与方法的修饰符无关   方法重写(Override): 方法重写必须是子类继承父类,才能进行对父类的方法...

    方法重载(Overload):

    1.在同一个类中

    2.方法名相同

    3.参数的个数或类型不同

    4.与方法的返回类型无关

    5.与方法的修饰符无关

     

    方法重写(Override):

    方法重写必须是子类继承父类,才能进行对父类的方法进行重写。

    1.重写方法与被重写方法必须拥有相同的方法名

    2.重写方法与被重写方法必须拥有相同的参数列表

    3.重写方法的返回值类型必须与被重写方法的返回值类型相同

    4.重写方法不能缩小被重写方法的访问权限

    这里注意的是重写方法,必须是子类中能访问到的父类的方法。

     

    方法重载与方法重写的区别:

    1.重载是同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关

    2.重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同

     

    方法重载示例:

     

     

    //默认初始方法,没有参数
        public void work(){}
        
        //重载的方法,含有一个int类型的参数
        public void work(int x){}
        
        //重载的方法,含有一个String类型的参数
        public void work(String str){}
        
        //重载的方法,含有两个int类型的参数
        public void work(int x,int y){}
        
        //错误的重载1,这里会出错,因为重载与返回类型无关
        public int work(){return 0;}
        
        //错误的重载2,这里会出错,因为重载与访问修饰符无关
        private int work(){}

     

    测试效果的话,直接使用this关键加.重载的方法会显示出来

     

     

    方法重写示例:

    /*
     * 父类代码
     */
    public class Parent {
        
        //要被重写的方法
        public void work(){
            //省略代码块
        }
        //要被重写的方法
        public void run(String p){
            //省略代码块
        }
        public void sleep(String p){
            //省略代码块
        }
        //此方法无法被重写,因为在子类中访问不到
        private void eat(){
            //省略代码块
        }
    }
    
    /*
     * 子类代码
     */
    public class Child extends Parent {
        
        //重写了父类方法
        public void work(){
            //省略代码块
        }
        //重写了父类方法
        public void run(String people){
            //省略代码块
        }
        //此处无法构成方法重写,因为与父类中的sleep方法的参数列表不同
        public void sleep(){
            
        }
        //这里会提示编译错误,因为与父类的方法返回类型不同
        public String sleep(String p){
            return "nihao";
        }
    }

     

    
     
    展开全文
  • 要了解重载与重写,首先需要了解java的动态链接与静态解析。 静态解析:有些符号引用在类加载阶段或者第一次使用时,就会转换为直接引用(内存中的地址),这种转换叫做静态解析。 动态链接:还有一些符号引用则是在每...

    静态解析与动态链接
    要了解重载与重写,首先需要了解java的动态链接与静态解析。
    静态解析:有些符号引用在类加载阶段或者第一次使用时,就会转换为直接引用(内存中的地址),这种转换叫做静态解析。
    动态链接:还有一些符号引用则是在每一次运行期间转换为直接引用,这种转换叫做动态链接(java多态的体现)。

    在java虚拟机中一共有5个方法调用字节码指令:
    invokestatic:调用静态方法。
    invokespecial:调用实例构造器方法、私有方法、父类方法
    invokevirtual:调用所有虚方法
    invokeinterface:调用接口方法,会在运行时确定一个接口实现类。
    invokedynamic:动态调用。

    其中符合静态解析的是:invokestatic和invokespecial。即:静态方法、私有方法(无法被复写)、实例构造器、父类方法。这4中调用在类加载的时候会把符号引用解析为该方法的直接引用。

    方法重载:
    1、方法重载是指在一个类中,方法的名称相同,方法的输入参数个数不同,或者参数的类型不同。
    方法重载符合静态解析,应为在类加载阶段,方法中的参数类型已经确定,要调用哪个方法也已经确定,可以直接将符号引用替换为直接引用。

    可以看如下一段代码的输出结果,加深对重载以及静态解析的理解

    public class MyClassTest4 {
    	private void setParent(GroundParent p) {
    		System.out.println("GroundParent");
    	}
    	
    	private void setParent(Parent p) {
    		System.out.println("Parent");
    	}
    	
    	private void setParent(Son p) {
    		System.out.println("Son");
    	}
    	
    	public static void main(String[] args) {
    		GroundParent p1 = new Parent(); //声明是静态类型GroundParent,new是实际类型
    		GroundParent p2 = new Son();
    		MyClassTest4 mc = new MyClassTest4();
    		mc.setParent(p1);
    		mc.setParent(p2);
    	}
    }
    class GroundParent{}
    class Parent extends GroundParent{}
    class Son extends Parent{}
    

    结果输入是:GroundParent。
    分析:对于变量来说,变量的声明式静态类型,比如上面的GroundParent;new是实际类型,比如Parent和Son。对于重载方法来说,看的是变量的静态类型,而p1和p2的静态类型都是GroundParent。所以在类加载的初始化阶将方法多大的符号调用替换为参数为GroundParent的方法直接引用。

    方法重写(复写):
    子类覆盖父类的方法。被重写的方法被调用,无法确认调用者是父类本身还是子类,只有等到运行期,对调用者进行类型确认后才能确定调用方法的直接引用。
    方法重写是动态分派的体现。
    动态分派是指在运行期才能根据实际类型确定方法执行版本的分派过程。
    动态分派中将方法调用者称作接收者

    看下面一端代码的编译后的二进制字节

    public class MyTest4 {
    	public static void main(String[] args) {
    		T t = new T();     //声明类型一样,实际类型不一样
    		T son = new Tson();//声明类型一样,实际类型不一样
    		t.say();
    		son.say();
    	}
    }
    class T {
    	public void say() {}
    }
    class Tson extends T{
    	public void say() {}
    }
    

    查看编译后的二进制字节码:
    在这里插入图片描述
    可以看到invokevirtual指令后面的参数一样。那么JVM如何阿紫运行期区分不同的实际类型那?
    invokevirtual指令的运行时解析过程:
    1)找到操作数栈顶的第一个元素(接收者)所指向的对象的实际类型,记作C
    2)如果在C中(常量池中)找到与常量中的描述符和简单名称都相同的方法,并且访问权限校验通过,则返回这个方法的直接引用,查找结束;如不通过,返回访问权限错误。
    3)否则,按照继承关系从下往上对C的各个父类进行第2步的搜索和校验过程
    4)如果始终找不到,抛出AbstractMethodError异常。

    虚方法表
    由于动态分派非常频繁,搜索会很耗时,所以常用的优化手段就是在方法区建立一个虚方法表(vritual method table,也成为了vtable);对应地,在invokeinterface执行时也会用到接口方法表( interface method table,也叫itable),使用虚方法表索引来代替元数据查找以提高效率。

    1)虚方法表中存放着各个方法的实际入口地址;
    2)如果某个方法在子类中没有被复写,那么子类的虚方法表里面的地址入口与父类相同方法的地址入口一致,都指向父类的实现入口
    3)如果自诶中重写了这个方法,子类方法表中的地址会替换为指向子类实现版本的入口地址。
    4)为了实现上的方便,须有相同签名的方法,在父类、子类的虚方法表中都应该具有一样的索引序号,这样当类型变换时,仅需要变更查找的方法表,就可以从不同的虚方法表中按索引转换出所需要的入口地址。

    方发表一般在类加载的连接阶段进行初始化(连接的解析阶段),准备了类的变量初始值后,虚拟机会把该类的方发表初始化完毕。

    展开全文
  • 方法重载:同一个类中,可以创建多个方法名称相同方法参数不同的方法。 方法名称相同,参数不同(数目,顺序,类型),返回值无要求。方法重写:子类中,重新实现父类的方法。和父类的方法签名一样。 方法名称相同...
  • java方法重载与方法重写的区别 异 同 方法名相同
  • Java方法重载与方法重写的区别1.方法重载2.方法重写 1.方法重载 发生在同一个类中,方法名相同,参数列表不同。方法返回类型、权限修饰符不做参考依据。 2.方法重写 发生在继承类中,方法名相同,参数列表相同。 ...
  • 方法重载 (overload) 1.方法重载定义: 在同一个类中,具有相同的方法名,但是参数类型不同或参数个数不同,这就构成方法重载。 2.方法重载的核心: 两同:同一个类,相同方法名 两不同: 参数类型不同,参数...
  • class ChongZai{public void a(int a);public void a(Strting a);...方法名(也可以叫函数)一样3.参数类型不一样或参数数量不一样重载的作用:还是以上面的例子ChongZai cz =new ChongZai();cz.a(1)...
  • java中的方法重载与方法重写java中的两种多态性: 方法重载(Overload)+方法重写(Override)/覆盖,那么,java方法重载和方法重写有什么区别吗?下面跟yjbys小编一起来看看吧~(1)方法重载(Overload)(一个类中)目的:用...
  • java方法重载与重写

    2019-11-09 10:38:16
    在学习java类的继承的时候,出现了方法的重载以及方法的重写;为了避免混乱。所以整理了一下; 方法重载 方法重载:在一个类中或者在继承类中都可以 package HomeWork; /* 重载 */ public class Test9 { public ...
  • 方法重写与方法重载 方法重写 方法重写加上@override声明注解不会报错证明是方法重写 重写的方法父类的方法的方法名相同 重写的方法父类的方法参数类型相同,参数个数相同 重写方法的返回值只能是父类返回值的...
  • java中方法的重载与重写的区别重载和重写,这是两个新概念,是两个令我们容易混淆的概念。方法重载(overloading method) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。方法重写...
  • 一、方法重写(0veriding)在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大...
  • Java方法重载与重写

    2018-05-10 11:48:01
    方法重载:方法同类同名不同参同类:在同一个类中发生同名:方法名相同不同参:(顺序不同.个数不同.类型不同)
  • 二者名字相似,但用处大不相同方法重载java在同一个类中可以定义多个重名的方法,用于不同的用途。这些同名的不同方法之间的区别在于参数列表的不同。这就是方法重载。比如写一个比大小的程序//比大小public static ...
  • 重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现...
  • 方法重写: 是父类子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法父类中...
  • Java方法重写与重载的区别

    万次阅读 多人点赞 2018-08-23 10:26:39
    Java方法重写与重载 一、方法重写(0veriding) 在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。 子类可以定义新的特征,当子类需要修改父类...
  • 重载方法名一致即可,访问修饰符、返回值类型无关,然后不同的重载方法参数列表的参数的顺序,类型,数量进行变换即可。重写重写方法的访问修饰符可以不同,但访问权限需要比父类中的大,比如pro...
  • java方法重载 重写

    2015-12-18 10:31:00
    class ChongZai{  public void a(int a);  public void a(Strting a);  public void a(int a,int b);...2.方法名(也可以叫函数)一样 3.参数类型不一样或参数数量不一样 重载的作用: 还是以上面...
  • java方法重载与重写的特点与区别

    千次阅读 2019-04-22 18:42:58
    方法重载的特点: 同名不同参,返回值无关。 父类原方法: public int test(int a,int b){} 子类方法重载: ...public 返回值类型 test(float a,float b){}/...方法重写的特点: 遵循两同,小,一大原则 两同:...
  • Java方法重载与方法重写 方法重载 overload 方法重载:在同一个类中,如果方法名相同,但是参数不同则为方法重载. 参数不同 参数类型不同 参数顺序不同 参数个数不同 public class Student { protected String ...
  • 方法重载:在同一个类中,允许存在多个同名方法,只要它们的参数列表不同,修饰符和返回值类型无关,这样的多个同名方法之间构成重载。参数列表:参数个数,参数类型,参数顺序方法调用:根据实际传入的参数决定...
  • Java方法重载与重写

    2019-07-12 10:51:00
    目录 - 方法重载 ...@(Java方法重载与重写) - 方法重载 1.方法名相同 2.参数列表不同 public void person(double height,double weight){ } public void person(String name,int age){ }...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,861
精华内容 1,544
关键字:

java方法重载与方法重写

java 订阅