博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java——面向对象
阅读量:5214 次
发布时间:2019-06-14

本文共 2004 字,大约阅读时间需要 6 分钟。

方法重载:

定义:

同一个类中的方法,方法名称相同,参数列表不同,我们称之为方法重载

注意事项:

不能根据方法的返回值来区分方法是否重载,因为java调用方法时可以忽略方法的返回值,假如现在同一个类中有两个方法,int f(),void f(),这两个方法方法名称相同,参数列表相同,只有返回值不同,当你调用f()时,你知道调用的是哪个方法吗?这时你糊涂了,那么java系统也会糊涂,所以不能根据返回值来判断一个方法是否重载

 

This关键字:

定义:

this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的引用有两种情况:1、构造器中引用该构造器正在初始化的对象;2、在方法中引用调用该方法的对象

注意事项:

  1. 静态方法中不能使用this关键字,因为静态方法通过类名直接调用,可以不用对象调用,既然连对象都没有了,何来的this
  2. 在类的某个方法中调用该类的另一个方法时,可以省略this关键字比如在run()方法中调用jump()方法,可以直接jump();调用,虽然这里的this省略了,但是本质上还是通过this来调用jump()方法

 

成员变量和局部变量:

定义:

成员变量:指的是在类中定义的变量,成员变量分为类变量和实例变量

  • 类变量:用static关键字修饰的变量,可以直接通过类名来访问
  • 实例变量:没有用static关键字修饰的变量,只能通过类的实例来访问

局部变量:指的是在方法中定义的变量

 

多态:

Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态

 

现在有如下代码:

class BaseClass{	public int book=6;	public void base() {		System.out.println("父类的普通方法");	}		public void test() {		System.out.println("父类被覆盖的方法");	}}public class SubClass extends BaseClass {	public String book="java编程思想";	public void test() {		System.out.println("子类覆盖父类的方法");	}	public void sub() {		System.out.println("子类的普通方法");	}		public static void main(String[] args) {		BaseClass bc=new BaseClass();//测试1		System.out.println(bc.book);		bc.base();		bc.test();		System.out.println("===========");				SubClass sc=new SubClass();//测试2		System.out.println(sc.book);		sc.base();		sc.test();		System.out.println("===========");				BaseClass bs=new SubClass();//测试3		System.out.println(bs.book);		bs.base();		bs.test();                 //bs.sub();这行代码编译时报错			}}

  

运行结果:

6父类的普通方法父类被覆盖的方法===========java编程思想父类的普通方法子类覆盖父类的方法===========6父类的普通方法子类覆盖父类的方法

  

测试1和测试2编译时类型和运行时类型相同,所以没有多态发生,测试3编译时类型是BaseClass,而运行时类型是SubClass,所以当执行bs.base()时首先去SubClass类中查找此方法,发现没有base方法,则去父类中查找,发现存在该方法,则调用父类的base方法,接着执行bs.test(),由于之类重写了父类的test方法,所以此时执行的是之类的test方法,大家可能会有疑问,为什么bs.book的值不是java编程思想,而是6呢?照理说应该访问的是子类的book。与方法不同的是,对象的实例变量不具备多态性,所以这里输出的是父类的实例变量。bs.sub()编译时报错,因为BaseClass bs=new SubClass();这行代码编译的类型是BaseClass,而BaseClass中没有sub()方法,所以编译错误

 

转载于:https://www.cnblogs.com/wgblog-code/p/11309919.html

你可能感兴趣的文章
P1-13:集成日志组件 logback 2彩色日志
查看>>
Linux升级内核教程(CentOS7)
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>
Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
查看>>
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
查看>>
Hibernate中inverse="true"的理解
查看>>
高级滤波
查看>>
使用arcpy添加grb2数据到镶嵌数据集中
查看>>
[转载] MySQL的四种事务隔离级别
查看>>
QT文件读写
查看>>
C语言小项目-火车票订票系统
查看>>
15.210控制台故障分析(解决问题的思路)
查看>>