为什么要使用继承?

继承的好处:

(1)抽取出了重复的代码,使代码更加灵活

(2)建立了类和类之间的联系

继承的缺点:

耦合性太强

OC中的继承

1、OC中不允许子类和父类拥有相同名称的成员变量名;(java中是可以的)

2、编译器从上往下执行,所以在子类前面至少应该要有父类的声明;如

@interface Worker : Person
 
@end

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在内存是怎么存放的?

一个类的静态方法和静态变量使用原理,JVM会把类的这个静态方法和静态变量在类加载的过程中读入内存(事实上是方法区),相当于常驻内存。也叫做类加载,static 修饰的 在JVM运行时就加载到内存中了 所以不需要实例类
大家都知道,在程序中任何变量或者代码都是在运行时由系统自动分配内存来存储的,而所谓静态就是指在第一次分配内存后,所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢? 在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制),因为static修饰的方法在编译时就进行静态绑定了,每个静态方法都在不同的内存空间,所以还是调用父类的静态方法。

结论:

1、OC中的继承是先到子类中找,找不到再到父类中找。
2、java中的继承是先到父类中找,找不到再到子类中找。

java中的继承与oc中的继承的区别的更多相关文章

  1. Swift: 比较Swift中闭包传值、OC中的Block传值

    一.介绍 开发者对匿名函数应该很清楚,其实它就是一个没有名字的函数或者方法,给人直观的感觉就是只能看到参数和返回值.在iOS开发中中,它又有自己的称呼,在OC中叫Block代码块,在Swift中叫闭包 ...

  2. OC中的字符串常用方法

    OC中的字符串常用方法 OC中对字符串进行操作使用了Foundation框架中的NSString类(不可变).NSMutableString类(可变). NSString 1.创建字符串 [objc] ...

  3. OC中的@interface和java中的区别以及 @implementation @protocol

      java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时, ...

  4. OC中SEL,类别,继承,协议的使用

    1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...

  5. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  6. java中静态属性和和静态方法的继承问题 以及多态的实质

    首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...

  7. oc中protocol、category和继承的区别

    OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...

  8. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  9. 谈谈java中静态变量与静态方法在有继承关系的两个类中调用

    谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...

随机推荐

  1. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3548  Solved: 1757[Submit][Statu ...

  2. BZOJ4540 [Hnoi2016]序列

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. Win10---------专区

    待完善中---------------------------------- -----------------------------------------The End------------- ...

  4. sql server 执行上100mb sql sql sql server 无法执行脚本 没有足够的内存继续执行

    cmd osql -S 服务器名称 -E  -i sql文件路径 ------------------------------------------------------ 最近遇到一个问题,在sq ...

  5. 用 const 还是用 let?

    ES6 里新增了两种声明变量的方式,let 和 const,加上原来的 var,一共就有三种方式来声明变量了.那到底该用哪个呢?关于“尽可能不用 var” 这一点,大家应该没有什么意见分歧(其实还是有 ...

  6. hadoop源码编译——2.5.0版本

    强迫症必治: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using b ...

  7. NOSDK--SDK一键打包及统一接入的实现(前言)

    前言 一,一键打包的实现 1.1 shell脚本执行流程介绍 1.2 自动刷新mk文件的脚本介绍 1.3 编译及拷贝资源的脚本介绍 1.4 打包及签名的脚本介绍 1.5 mac下的脚本环境配置及脚本的 ...

  8. ThinkPHP 利用.htaccess文件的 Rewrite 规则隐藏URL中的 index.php

    1.首先修改Apache的httpd.conf文件. 确认httpd.conf配置文件中加载了mod_rewrite.so 模块,加载的方法是去掉mod_rewrite.so前面的注释#号 讲http ...

  9. 《征服 C 指针》摘录5:函数形参 和 空的下标运算符[]

    一.函数的形参的声明 C 语言可以像下面这样声明函数的形参: void func(int a[]) {     // ... } 对于这种写法,无论怎么看都好像要向函数的参数传递数组. 可是,在 C ...

  10. vi 常用命令

    1.关于退出 :wq!  ----强制保存退出 :wq  ---- 保存退出 ZZ  ---- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式) :q  ---- 退出 :q!  ---  强 ...