java——面向对象

方法重载:

定义:

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

注意事项:

不能根据方法的返回值来区分方法是否重载,因为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()方法,所以编译错误

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Nicky's blog

servlet中的IllegalStateException

本文链接:https://blog.csdn.net/u014427391/article/details/97397116

9830
来自专栏gfu

迭代器模式

java中的迭代器想必大家都用过,但是大家知道他的性能以及实现原理吗?今天就来介绍一波 实际上foreach封装了迭代器,迭代器又封装了for循环,这样一来,...

4620
来自专栏DotNet Core圈圈

ASP.NET Core 中的 ServiceProvider

在 ASP.NET Core 中,微软提供了一套默认的依赖注入实现,该实现对应的包为:Microsoft.Extensions.DependencyInject...

11520
来自专栏码匠的流水账

聊聊dubbo的ServiceBeanExportedEvent

dubbo-2.7.3/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/conf...

8530
来自专栏Android 开发者

[译]区域设置更改和 AndroidViewModel 反面模式

在 ViewModel 中,如果要公开来自资源(字符串、可绘制文件、颜色……)的数据,则必须着重考虑 ViewModel 对象而忽视配置更改,例如区域设置更改。...

13460
来自专栏业余草

Redis 与序列化

序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有:JDK(不支持跨语言)、JSON、XML、Hessian、Kry...

22140
来自专栏码匠的流水账

聊聊dubbo的ConfigChangeEvent

dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/d...

12000
来自专栏acoolgiser_zhuanlan

QT QJsonObject 与 QJsonArray 中insert()方法 插入值的顺序问题

本文链接:https://blog.csdn.net/acoolgiser/article/details/99442177

70030
来自专栏码匠的流水账

聊聊dubbo的DubboComponentScanRegistrar

本文主要研究一下dubbo的DubboComponentScanRegistrar

15020
来自专栏业余草

Netty系列之Netty线程模型

最近发现极客时间的很多课程中,都穿插到了 Netty,可见 Netty 的重要性。基于此,给大家推荐一下这篇文章!

7230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励