面向对象重写理解 求值策略 -共享对象调用 面向对象原则

面向对象和面向过程

面向过程,自顶向下实现逻辑,一般先写一个方法,方法里使用ifelse/for等解决问题,几个排序算法都属于这类。

面向对象,面向对象是对于业务高度抽象,对于每个步骤进行抽象,形成对象,对象的调用和组合来解决问题。

也就是说,对象对象编程是吧熟悉和行为封装再对象上,基于对象的能力(方法)来解决问题。冰箱装象问题,人,冰箱,象,人有方法移动(物品),打开(物品),冰箱有方法开门关门。

面向对象:占用资源相对高,速度相对慢。 面向过程:占用资源相对低,速度相对快。

面向对象三个特征和五个原则

类和对象的关系,对象是实体的抽象,类是对象的抽象。对象是类的实例,类是对象的模板。

1.封装,封装是对于类和对象来说的,为对象的内部数据提供不不同级别的防护

2.继承,使用现有对象的所有能力,继承接口和继承类,

3.多态,类再相同方法不同情况的展现,是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

重写和重载,重写是子类重写父类实现的,父类的会被覆盖,重载是一个类一个方法不同参数

重写就是多态最好体现,在运行时多态, 重载一般被叫做静态重载,编译时多态,个人不认为是多态

     class Dog {
            public void bark() {
                System.out.println("woof ");
            }
        }
        class Hound extends Dog {
            public void sniff() {
                System.out.println("sniff ");
            }

            public void bark() {
                System.out.println("bowl");
            }
        }
        public class OverridingTest {
            public static void main(String[] args) {
                Dog dog = new Hound();
                dog.bark();
            }
        }
输出结果是 bowl
    
    上面的例子中,dog 对象被定义为 Dog 类型。在编译期,编译器会检查Dog类中是否有可访问的 bark()方法,只要其中包含 bark()方法,那么就可以编译通过。在运行期,Hound 对象被 new 出来,并赋值给 dog 变量,这时,JVM 是明确的知道dog 变量指向的其实是 Hound 对象的引用。所以,当 dog 调用 bark()方法的时候,就会调用Hound类中定义的 bark()方法。这就是所谓的动态多态性。

一. single responsibility princeple 类的职责单一

二. open close priciple 核心是面向抽象编程,不对具体,类依赖于抽象,因此不修改类,通过继承和多态扩展方法所以是开发

三. liskov substitution priciple 子类能替换父类,也是面向接口编程,保证扩展性和多态

四. dependecy inversion principle 依赖抽象不依赖具体,接口和实现分离

五. interface segregation principle 多个小接口,不要一个大接口,使用接口多继承分离

ARTHUR J.RIEL 在那边《OOD 启示录》中所说的:“你并不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看做警铃,若违背了其中的一条,那么警铃就会响起。

平台无关性;

Java 语言规范 O 通过规定 Java 语言中基本数据类型的取值范围和行为

Class 文件 O 所有 Java 文件要编译成统一的 Class 文件

Java 虚拟机 O 通过 Java 虚拟机将 Class 文件转成对应平台的二进制文件等

Java 的平台无关性是建立在 Java 虚拟机的平台有关性基础之上的,是因为Java虚拟机屏蔽了底层操作系统和硬件的差异。

形参和实参

public static void main(String[] args) {
ParamTest pt = new ParamTest();
pt.sout("Hollis");//实际参数为 Hollis
}
public void sout(String name) { //形式参数为 name
System.out.println(name);
}

求值策略

  • 传值调用(值传递) 在传值调用中,实际参数先被求值,然后其值通过复制,被传递给被调函数的形式参数。因为形式参数拿到的只是一个"局部拷贝",所以如果在被调函数中改变了形式参数的值,并不会改变实际参数的值。
  • 传引用调用(引用传递) 在传引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。因为传递的是引用,所以,如果在被调函数中改变了形式参数的值,改变对于调用者来说是可见的。
  • 传共享对象调用(共享对象传递) 传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为" 传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。

java是共享对象传递传递的是引用赋值后的值,传递的是一个值,所以说java只有值传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值