前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java——面向对象

java——面向对象

作者头像
说故事的五公子
发布2019-09-11 17:34:14
7420
发布2019-09-11 17:34:14
举报

方法重载:

定义:

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

注意事项:

不能根据方法的返回值来区分方法是否重载,因为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引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态

现在有如下代码:

代码语言:javascript
复制
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();这行代码编译时报错
		
	}
}

运行结果:

代码语言:javascript
复制
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()方法,所以编译错误

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法重载:
  • This关键字:
  • 成员变量和局部变量:
  • 多态:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档