为什么要使用继承?

继承的好处:

(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. Mysql服务启动的时候 如何加载配置文件

    Mysql服务启动的时候 如何引导配置文件 (启动加载顺序)

  2. excel学习

    制作打钩方格 :输入R ,然后选中R,在字体中选中wingdings 2即可 快速选中一列:选中两行以上,然后Ctrl+Shift+下 分段显示手机号:选中单元格,Ctrl+1,然后选中数字,自定义, ...

  3. 面试题目——《CC150》树与图

    面试题4.1:实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1. 思路:两个方法,第一种速度较快 package cc150; public ...

  4. 获取centos6.5系统信息脚本

    最近想尝试做两件比较重要的事情,第一是用python写个cmdb,第二还是用python写个小型监控系统,下面是获取系统信息的脚本: #!/usr/bin/env python # coding:ut ...

  5. sicp-py

    第一章 在第一章中,我们专注于计算过程,以及程序设计中函数的作用.我们看到了如何使用原始数据(数值)和原始操作(算术运算),如何通过组合和控制来形成复合函数,以及如何通过给予过程名称来创建函数抽象.我 ...

  6. C# 读取excel日期时获取到数字转换成日期

    string strDate= DateTime.FromOADate(Convert.ToInt32(data[i][7])).ToString("d"); strDate= D ...

  7. [Java] Java执行Shell命令

    Methods ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来 ...

  8. java基本知识小记(1)

    1.Java中的值传递 值传递意味着对于传给方法的每个参数都会制作一份副本然后将副本而不是原始值传递给方法并且通过参数的名进行引用. 注意:虽然传值机制对于所有参数类型都适用,但是他对对象类型的作用与 ...

  9. 商品库存“存取设计”,MySQL事务、表锁、行锁

    MySQL  使用 SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的 Tansaction isolation level 为 REPEATA ...

  10. Java总结篇系列:Java多线程(一)

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...