动态绑定、阻止继承,final类和方法
1、编译器查看对象的声明类型和方法名。当调用
x.f(param);
且隐式参数x生命为C类对象。这时候可能有多个名字都叫f,但是参数类型不一样的方法。编译器会一一列举C类中名为f的方法和其超类中访问属性为public并且名为f的方法。(超类的私有方法是不能访问的)
进行到这里的时候编译器已经获得了可能被调用的所有的候选方法。
紧接着,编译器就会开始查看调用犯非法提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析。
到这个时候编译器已获得需要调用的方法名字和参数类型。
2、有时候,不希望利用某个类定义子类,不允许扩展的类成为final类。
例如,当想阻止定义Executive类的子类,就可以定义这个类的时候使用final修饰符。
final class Executive extends Manager
{
······
}
类中所有的特定方法也会被声明为final。如果这样做,子类就不能覆盖这个方法。(final类中所有的方法自动的成为final方法)
例如:
class Exployyee
{
······
public final String getName()
{
return name;
}
······
}
如果将一个类声明为final,只是其中的方法自动成为能够为final,而不包括域。
3、强制类型转换
我们都学过将一个类型强制转换为另一个类型:
double x = 3.405;
int nx = (int)x;
表达式x的值就会被转换为整数类型,舍弃了小数部分。
有时候我们也会需要将某个类的对象引用转换成另外一个类的对象使用,例如:
Manager boss = (Manager) staff[0];
在进行类型转换之前我们可以先查看一下是否能够转换成功,这个过程使用instanceof就可以实现。
if (staff[1] instanceof Manager)
{
boss = (Manager) staff[1];
······
}
类型转换的法则:
只能在继承层次内进行类型转换。
在将超类转换成子类之前,应该使用instanceof进行检查。
动态绑定、阻止继承,final类和方法的更多相关文章
- android开发中关于继承activity类中方法的调用
android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import and ...
- 135-PHP final类和方法都是不可被继承或覆盖的
<?php final class final_class{ //定义final修饰的类 } class myclass extends final_class{ //试图继承final修饰的类 ...
- java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”
/*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...
- java基础知识回顾之---java String final类普通方法的应用之“模拟字符串Trim方法”
/* * 4,模拟一个trim功能一致的方法.去除字符串两端的空白 * 思路: * 1,定义两个变量. * 一个变量作为从头开始判断字符串空格的角标.不断++. * 一个变量作为从尾开始判断字符串空 ...
- java基础知识回顾之---java String final类普通方法的应用之字符串数组排序
/* * 1,给定一个字符串数组.按照字典顺序进行从小到大的排序. * {"nba","abc","cba","zz", ...
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”
/* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" * * 思路: * 1,既然取得是最大子串,先看 ...
- java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”
/* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个 ...
- (七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)
java中所有的继承都是公有继承. 在子类中的构造其内可以初始化超类的公有域,但不能初始化超类的私有域. 因此需要在子类构造前的第一行使用super()语句初始化超类的私有域. 如果超类没有不带参数的 ...
随机推荐
- php curl 基本用法
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); curl_se ...
- po 和 mo 的互相转换
反编译 mo 文件成 po 文件 msgunfmt test.mo -o test.po 编码 po 文件为 mo 文件 msgfmt -o test.mo test.po 记着备用.
- Ubuntu等Linux系统清除DNS缓存的方法
buntu等Linux系统清除DNS缓存的方法 直接说方法: 如果系统下有nscd,那么就直接 sudo /etc/init.d/nscd restart 如果没有也没关系,网上接受的方法大都是 su ...
- 导入表 IMPORT_DESCRIPTOR
typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for terminating null i ...
- pdf转图片
public class FileUtil { public static void main(String[] args) { try { System.out.println(System.cur ...
- 从汇编来看c语言之指针
一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空 ...
- nodejs定时任务node-schedule
1:使用npm安装node-schedule模块 npm install node-schedule (1)每隔5分钟执行一次: var schedule = require('node-schedu ...
- javascript 要注意的事项
记入一些容易出错的地方 function someClass() { this.name = null; 或 undefined } var obj = new someClass(); consol ...
- Android项目的图标
项目的图标就是在AndroidManifest.xml中通过android:icon="@drawable/ic_launcher"来指定的,ic_launcher这张图片可以放在 ...
- DACL, NULL or not NULL
上周 hBifTs在折腾他的文件映射封装类的时候,碰到了不能在 ASP.NET 中直接打开由桌面程序创建的内核对象的问题. 内存映射文件与用户权限 他当时是的方法是修改 ASP.NET 配置文件,让 ...