疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写
一、方法重载(Overload):
Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异).
同时这这里我们需要注意以下两点:
A.方法重载与返回值类型没有任何关系;
B.方法重载与是否有static修饰没有任何关系.
那我们如何才能确定到底调用的哪个方法呢?
A.主调者:明确是谁在调用这个方法,是类还是对象
B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定)
例1:
public class TestMethodLoad{
public void test(){
System.out.println("~~没有形参的test方法~~");
}
public void test(String name){
System.out.println("~~带一个形参的test方法~~,参数名为:" + name);
}
public static void main(String[] args){
TestMethodLoad t = new TestMethodLoad();
t.test();
t.test("哈喽");
}
}
例2:
public class TestMethodLoad2{
public void test(String name){
System.out.println("带一个参数的方法,参数是:" + name);
}
public void test(String... msgs){
for(String msg : msgs){
System.out.println("带可变String类型参数的方法,参数是:" + msg);
}
}
public static void main(String[] args){
TestMethodLoad2 tl = new TestMethodLoad2();
tl.test("哈喽");
tl.test("123","jkl");
}
}
二、构造器重载:
构造器可以认为它是个特殊的方法:无需声明返回值类型,如果声明了返回值类型则变成普通方法;
构造器的作用:构造器并不是创建对象,而是初始化实例,严格来说对象是new出来的;
构造器重载:完全类似于方法重载 -- 两同(同一个类、方法名相同)-- 一异(形参列表不同)
public class Monkey{
private String name;
private double weight;
private int age;
//提供带两个参数的构造器
public Monkey(String name , double weight){
this.name = name;
this.weight = weight;
}
//提供带三个参数的构造器,构造器的作用是用来初始化实例的
public Monkey(String name , double weight , int age){
this(name,weight);
this.age = age;
}
public void info(){
System.out.println("这是一只猴子,它的名字是:" + name +
",体重是:" + weight + ",年龄是:" + age);
}
public static void main(String[] args){
Monkey m = new Monkey("小金刚",100);
m.info();
Monkey m2 = new Monkey("金刚",300,20);
m2.info();
}
}
三、方法重写(Override)/方法覆盖:
方法重写是用在子类与父类之间的,而方法重载是用于同一个类的,当子类从父类那里继承得到的方法,不能真正满足子类需求的时候,子类可以重写父类的方法。
1、方法重写规则:
两同:方法名相同、形参列表相同;
两小:子类重写方法的返回值类型必须比父类方法的返回值类型更小或相等;子类重写方法的声明抛出异常必须比父类方法的声明抛出异常更小或相等
一大:子类重写方法的访问权限必须比父类更大或相等。
2、@Override:强制要求子类必须重写方法标识符
作用:要不编译的时候则出错,防止重写父类方法出错;让编译器执行更严格的检查,要求被修饰的方法必须是重写父类的方法
public class Bird{
public void fly(){
System.out.println("这是一只在填空飞翔的鸟啊~~");
}
}
public class TuoNiao{
public void fly(){
System.out.println("鸵鸟太笨了,只能在地上跑了!");
}
public static void main(String[] args) {
TuoNiao tn = new TuoNiao();
tn.fly();//因为子类重写了fly方法,所以最终调用的是子类重写后的方法
}
}
注意:
public class GoldMonkey extends Monkey{
//子类会从父类那里获得所有Field与方法,不重写父类构造器的话默认会继承父类的空构造器,若父类没有空构造器则报错
public GoldMonkey(String name , double weight , int age){
this.name = name;
this.weight = weight;
this.age = age;
}
public static void main(String[] args){
GoldMonkey gm = new GoldMonkey("小金",300,12);
//调用从父类那里继承得到的方法
gm.info();//若子类没有重写info方法,默认则继承父类的info方法
}
//当子类从父类那里继承得到的方法,不能真正满足子类需求的时候,子类可以重写父类的方法
//protected void info(){} //错误 子类重写方法必须比父类的访问权限更大或相等。
public void info(){
//extends是继承了父类的所有方法和属性,所以它有name、weight、age等属性
//但由于父类访问权限为private 所以不能访问,此时需要修改父类Field属性为Protected/默认
System.out.println("这是一只金丝猴,名字是:" + name + ",体重是:" + weight + ",年龄是:" + age);
}
}
疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写的更多相关文章
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- 疯狂java学习笔记之面向对象(八) - static和final
一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Fie ...
- 疯狂java学习笔记之面向对象(四) - this关键字
Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...
- 疯狂java学习笔记之面向对象(九) - 抽象和接口
一.抽象(abstract): 1.抽象类: 使用abstract修饰的类就是抽象类; 相比于普通类抽象类增加了支持抽象方法的功能,但也丢失了创建实例的功能(抽象类中不能创建实例),其他普通类有的抽象 ...
- 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量
Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递
方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...
- 疯狂java学习笔记之面向对象(七) - super关键字
super有以下两大作用: 1.起限定作用:强制去访问父类的成员(Field.方法) 2.起调用作用:指定/显示调用父类的某个构造器 super调用规则: 1.子类构造器总会调用父类构造器一次,默认情 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
随机推荐
- 数据库TSQL语句
一.创建数据库create database test3;二.删除数据库drop database test3;三.如何创建表create(创建) table(表) test(表名)(此处写列 var ...
- Mac 下 gradle 路径
/Users/yourname/.gradle/wrapper/dists cmd:cd ~/.gradle/wrapper/dists/
- "稀奇古怪的"delete this
myClass::foo(){ delete this; } .. void func(){ myClass *a = new myClass(); a->foo(); ...
- NYOJ题目1102Fibonacci数列
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAKFCAIAAABEM2gdAAAgAElEQVR4nO3dP1Iqy98H4HcT5i7EmI ...
- UVA 624 CD
主要是打印路径有点麻烦,然后就是用于标记的数组要开大点,不然会狂wa不止,而且还不告诉你re #include <cstdio> #include <iostream> #in ...
- 三、jQuery--jQuery实践--搜索框制作
input标签讲解 <input/>作为按钮的type属性:button.submit(后面会有二者对比分析)
- Linux环境下段错误的产生原因及调试方法小结
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
- 简简单单的一个PYTHON多进程实现
因为在作自动化部署时,希望能将多个服务分不同的批次进行发布, 同一批次的机器同时发布, 如果前面一批次出错误,后面就需要停止整 个流程. 那可以简单的用threading来实现了. thread_li ...
- 【131031】asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别
1.<% %>用来绑定后台代码 如: < % for(int i=0;i<100;i++) { Reaponse.Write(i.ToString()); } %> 2. ...
- JAVA 使用线程的几种方式
之前放在自己网站上的例子,因为网站关闭,已经找不到了,想用的时候,没有的话又重新翻书是很麻烦的事情.所以重新记录一下,以备将来查看. 第一种,让任务类继承Runable接口,然后将任务类对象放入Thr ...