20Java面向对象------方法的重写、重写与重载的区别、package和import

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44787898/article/details/102739412

1.方法的重写

  • 发生在子类中,方法名相同,参数列表不同,方法体不同
  • 重写方法在被调用时,看对象的类型
class Foo{
   public void f(){
      System.out.println("Foo.f()");
   }
}
class Goo extends Foo{
   public void f(){
      System.out.println("Goo.f()");
   }
}
Goo obj1 = new Goo();
obj1.f();
Foo obj2 = new Goo();
obj2.f();
//输出的结果均为"Goo.f()",
//当子类对象的重写方法被调用时
//(无论是通过子类的引用调用还是
//通过父类的引用调用),运行的是
//子类的重写后的版本。
  • 子类在重写父类的方法时,可以通过super关键字调用父类的版本
class Foo{
   public void f(){
      System.out.println("Foo.f()");
   }
}
class Goo extends Foo{
   public void f(){
      super.f();
      System.out.println("Goo.f()");
   }
}
Foo obj2 = new Goo();
obj2.f();
/**
*输出结果为:
*Foo.f()
*Goo.f()
*子类重写方法中的super.f();
*调用了父类的版本;这样的语法
*通常用于子类的重写方法在父类
*方法基础之上进行功能扩展。
*/

重写的演示

package oo.day04;
//重写的演示
public class OverrideDemo {

	public static void main(String[] args) {
/*
 * 重写需要遵循“两同两小一大”原则:一般都是一模一样的
 * 1.两同:
 *   1)方法名称相同
 *   2)参数列表相同
 * 2.两小:
 *   1)子类方法的返回值类型小于或等于父类的
 *   2)子类方法抛出的异常小于或等于父类的
 * 3.一大:
 *   1)子类方法权限大于或等于父类的---访问权限
 */
	}

}
//父类大,子类小
class Coo{
	void sayHi() {}
	double show() {return 0.0;}
	Coo test() {return null;}
	Doo say() {return null;}
	
}
class Doo extends Coo{
	void sayHi() {}//void必须相同
	double show() {return 1;}//基本类型相同
	Doo test() {return null;}//或小于父类
	//Coo say() {return null;}编译错误,引用类型必须小于或等于
}

2.重写与重载的区别

  • 重写:
    父子类中,方法名相同,参数类列表相同,方法体不同,
    遵循“运行期”绑定,根据对象的类型绑定方法
  • 重载:同一个类中,方法名称相同,参数列表不同,方法体不同
    遵循“编译期”绑定,根据引用的类型绑定方法
package oo.day04;
//重写与重载的区别
public class OverrideDemo {

	public static void main(String[] args) {
		//重载看引用,重写看对象
		Goo goo=new Goo();
		Eoo o=new Foo();//向上造型
		goo.test(o);

	}

}
//方法的重载,引用为o,o为 Eoo类型,所以调Eoo 的test
class Goo{
	void test(Eoo o) {
		System.out.println("父型参数");
		o.show();
	}
	void test(Foo o) {
		System.out.println("子型参数");
		o.show();
	}
}
//方法的重写
class Eoo{
	void show() {
		System.out.println("父类show");
	}
}
class Foo extends Eoo{
	void show() {
		System.out.println("子类show");
	}
}

3.package和import

package
  • 作用:避免类的命名冲突
  • 包名可以有层次结构,在一个包中可以包含另外一个包
    eg:package 包名1.包名3…包名n;
  • 建议:包名所有字母都小写
  • 类的完全限定名:包名.类名
import
  • 作用:声明类/引入类
  • 同包中的类可以直接访问
    不同包中的类想访问:
    先import声明类在访问类(建议)----类的全局限定名(包名+类名)
    类的全称-----太繁琐(不建议)

猜你喜欢

转载自blog.csdn.net/qq_44787898/article/details/102739412