java中的继承与oc中的继承的区别
为什么要使用继承?
继承的好处:
(1)抽取出了重复的代码,使代码更加灵活
(2)建立了类和类之间的联系
继承的缺点:
耦合性太强
OC中的继承
1、OC中不允许子类和父类拥有相同名称的成员变量名;(java中是可以的)
2、编译器从上往下执行,所以在子类前面至少应该要有父类的声明;如
3、OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果父类没有定义该方法,则继续在继承链上查找,直到找到为止,如果找到NSobject为止仍然未找到,则报错;
4、子类允许重写父类的方法,在调用子类对象的重写方法时,就会调用重写后的方法;(与java中子类重写父类中的非静态方法是一样的)
5、如果在子类中 需要调用父类的功能,可以借助super关键字(与java一样)。
java中的继承
注意:静态代码块不管创建多少个对象只执行一次,非静态代码块随着对象的创建而执行,并且总是在构造方法的前面执行。
1、父类的静态代码块—>子类的静态代码块—>主方法(执行哪个程序就执行哪个程序的主方法)—>父类的非静态代码块—>父类的无参构造函数—>子类的非静态代码块—>子类的无参构造函数(若实际子类执行的是有参构造函数,则不执行无参构造函数)—>成员函数(指的是非静态方法)(指定执行哪个就执行哪个成员函数,若重写了父类成员函数,则只执行子类的成员函数)
在多态的时候为什么子类重写父类的静态方法会调用父类的静态方法,而子类重写父类的非静态方法后就调用的是子类的非静态方法?
先看代码:
class SuperClass{
//静态方法
public static void staticMethod(){
System.out.println("SuperClass: inside staticMethod");
}
//非静态方法
public void method(){
System.out.println("SuperClass: inside method");
}
}
class SubClass extends SuperClass{
//overriding the static method
public static void staticMethod(){
System.out.println("SubClass: inside staticMethod");
}
//overriding the method
public void method(){
System.out.println("SubClass: inside method");
}
}
public class a
{
public static void main(String []args){
SuperClass superClass = new SuperClass(); //父类自身
SuperClass subClass1 = new SubClass(); //多态
SubClass subClass2 = new SubClass(); //子类自身
superClass.staticMethod();
subClass1.staticMethod();
subClass1.method();
subClass2.staticMethod();
}
}
运行结果:

注意第二行的输出结果,如果是重写静态方法的话,第二行的和第三行的结果是相同的。虽然就算你重写静态方法,编译器也不会报错,本质上这并不是重写,是你个人认为重写了而已,也就是说,如果你试图重写静态方法,Java不会阻止你这么做,但你却得不到预期的结果(重写仅对非静态方法有用)。重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。让我们猜一猜为什么静态方法是比较特殊的?因为它们是类的方法,所以它们在编译阶段就使用编译出来的类型进行绑定了。使用对象引用来访问静态方法只是Java设计者给程序员的自由。我们应该直接使用类名来访问静态方法,而不要使用对象引用来访问。而父类的非静态方法与子类的非静态方法名相同(包括参数),那才叫做重写,因为他们访问的是同一个内存空间,静态的内存空间请看下面。
我们得知道static在内存是怎么存放的?
大家都知道,在程序中任何变量或者代码都是在运行时由系统自动分配内存来存储的,而所谓静态就是指在第一次分配内存后,所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),因为static修饰的方法在编译时就进行静态绑定了,每个静态方法都在不同的内存空间,所以还是调用父类的静态方法。
结论:
java中的继承与oc中的继承的区别的更多相关文章
- Swift: 比较Swift中闭包传值、OC中的Block传值
一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...
- OC中的字符串常用方法
OC中的字符串常用方法 OC中对字符串进行操作使用了Foundation框架中的NSString类(不可变).NSMutableString类(可变). NSString 1.创建字符串 [objc] ...
- OC中的@interface和java中的区别以及 @implementation @protocol
java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时, ...
- OC中SEL,类别,继承,协议的使用
1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- java中静态属性和和静态方法的继承问题 以及多态的实质
首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...
- oc中protocol、category和继承的区别
OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
随机推荐
- opencv 比较直方图方式 进行人脸检测对比
完整opencv(emgucv)人脸.检测.采集.识别.匹配.对比 //成对几何直方图匹配 public static string MatchHist() ...
- 中软培训第一周复习总结 --简单的HTML 与CSS
一些需要记住的点: day1 HTML格式及简单标签: html 文件一般格式: 1 <html> 2 <head lang="en"> 3 <met ...
- 如何接触学习java
信息科技必将是未来的潮流,Java语言必将在时代的进步中发挥不可估量的作用,未来,掌握好一门实用而且有良好应用前景的技术是你们的首要任务. 零基础怎么学Java 多年Java教育培训经验事实表明,零基 ...
- matlab 有趣小细节
图像的默认显示方式,坐标从1开始计数.是从左向右,从上到下为正,分别为x和y轴 如果加入x轴和y轴画成成的格子,起始位置并不是严格的左上角,而是像素的中心点,并不是以像素的边缘画格子 ...
- git gui 学习
目的 自己以前使用过3,4个月的SVN,因为公司使用的是git,git gui.所以打算自学git gui,并记录一下学习心得.^_^ 原因 为什么不是学命令行而是用git gui呢.我觉得首先因为公 ...
- 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载
转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...
- 【09-04】java内部类学习笔记
java中的内部类 静态内部类 成员内部类 方法内部类 匿名内部类 1.静态内部类 class Outer { private static String outer = "outer&qu ...
- tyvj1463 智商问题
背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...
- PHP mkdir 0777权限问题
在linux系统中,即使我们使用root帐号去手工执行php命令: mkdir('test', 0777); 结果文件的权限依然为: drwxr-xr-x 2 root root 4096 Jun 1 ...
- .NET读取Excel数据,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
解决.NET读取Excel数据时,提示错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序的操作: 1. 检查本机是否安装Office Access,如果未安装去去h ...