构造器

java中构造器的调用顺序

人走茶凉 提交于 2020-01-16 00:36:21
在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢? 先看一段代码: 1 public class Meal { 2 public Meal() { 3 System.out.println("meal constructor() "); 4 } 5 } 6 7 public class Bread { 8 public Bread() { 9 System.out.println("bread constructor() "); 10 } 11 } 12 13 public class Cheese { 14 public Cheese() { 15 System.out.println("cheese constructor() "); 16 } 17 } 18 19 public class Lettuce { 20 public Lettuce() { 21 System.out.println("Lettuce constructor() "); 22 } 23 } 24 25 public class Lunch extends Meal { 26 public Lunch() { 27 System.out.println("Lunch constructor() "); 28 } 29 } 30 31 public class

Java_7面向对象的三大特征

做~自己de王妃 提交于 2020-01-15 16:48:37
一、封装(模块化) 1.问题的引入: 当我们创建一个类的对象后,可以通过对象.属性的方式,对对象进行赋值。 这里,赋值操作受到属性的数据类型和存储范围的制约,除次之外,没有其他制约条件。 但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,这个条件又不能在属性声明时体现 ,我们只能通过一个public 方法对属性进行限制条件的添加(get(),set()) 同时,我们需要避免用户再使用“对象.属性”进行赋值,则需要将属性声明为私有化。 --》此时,针对属性就体现了封装。 2.封装的思想 (1)类的内部数据操作细节自己完成,不允许外部干涉。仅对外暴露少量的方法用于使用 (2)隐藏对象内部的复杂性。只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。 (3)封装性的设计思想:把该隐藏的隐藏起来,该暴露的暴露出来 例如: public class Animal{ int age;//年龄可能被赋为负数,不符合实际 int legs;//腿有可能被赋为负数或奇数个,不符合实际 } 所以可以给属性设置一个get()和set()方法,来添加限制条件,并获取和设置相应的属性值,如下: public class Animal{ private int age; private int legs; //对属性的设置 publci void setAge(int age){

Scala 常用注解

两盒软妹~` 提交于 2020-01-15 10:26:53
Scala的注解其实就是在编译时进行一些特殊的操作,很多是针对Java的概念提出的。简单的说,注解就是普通的类、变量、方法等,不过能让编译器支持特殊的操作。 注解通常使用的场景是类、方法、字段、局部变量和参数等。 类注解 ,如: @Entity class AccessLog 构造器注解 ,如: // 给主构造器添加注解时,需要将注解放置在构造器之前,并加上一对圆括号 class AccessLog @Inject() (var ip: String, var id: String) 变量注解 ,如: @BeanProperty var macId = _ 方法注解 ,如: @tailrec private def submit(args: SparkSubmitArguments, uninitLog: Boolean): Unit = {} 参数注解 ,如: def submit(@NotNull arg: SparkSubmitArguments) {} // 类型参数注解 class doRun[@specialized T] 表达式注解 ,如: // 表达式后有冒号,然后是注解 (argsMap.get(key) : @unchecked) match {} 自定义注解 ,需要扩展Annotation trait,如: class Access extends

think_in_java_多态

此生再无相见时 提交于 2020-01-15 05:06:40
向上转型:对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。 绑定:将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。后期绑定:在运行时根据对象的类型进行绑定【动态绑定或运行时绑定】java除了static方法和final方法之外,其他所有方法都是后期绑定。 多态是一项让程序员“将改变的事物与未来的事物分离开来”的重要技术。 对象方法若是静态的,则不具备多态性。 当子类对象转型为父类引用时(Father fa=new Son();//upcast),任何域访问操作都将由编译器解析,故不是多态的。 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。因为构造器具有一项特殊任务:检查对象是否被正确地构造。导出类只能访问自己的成员,不能访问基类成员(private) 一个复杂对象调用构造器要遵守下面的顺序: ①调用基类构造器,这个步骤反复递归,首先是构造这种层次结构的根,然后是下一层导出类,直到最低层的导出类。 ②按声明顺序调用成员的初始化方法。 ③调用导出来构造器的主体。 当覆盖被继承类的dispose()方法时,务必记住调用基类版本dispose()方法;否则,基类的清理动作不会发生(被多态了)。 初始化的实际过程: ①在其他任何事物发生之前

第五章 继承 | 学习笔记

孤街醉人 提交于 2020-01-14 15:45:41
Java核心技术 卷一 5.1 类、超类和子类 定义子类 下面是由继承Employee类来定义Manager类的格式,关键词extends表示继承。 例如: public class Manager extends Employee { 添加方法和域 } 关键词extends表明正在构造新类派生于一个已存在的类。已存在的类称为超类、基类或父类,新类称为子类、派生类或孩子类。 在Manager类中,增加一个用于存储奖金信息的域,以及一个用于设置这个域的新方法: public class Manager extends Employee { private double bonus ; . . . public void setBonos ( double bonus ) { this . bonus = bonus ; } } //方法使用: Manager boss = . . . ; boss . setBonus ( 5000 ) ; //父类不能使用子类方法,而子类可以使用父类方法。 覆盖方法 超类中的有些方法对子类Manager并不一定适用。具体来说,Manager类中的getSalary方法应该返回薪水和奖金的总和。,此时,就需要覆盖父类方法。 例如: public class Manager extends Employee { . . . public double

Thinking in Java第八章学习笔记----多态

Deadly 提交于 2020-01-14 12:18:26
封装:   封装就是把对象的行为和属性装在一个类里。 抽象:   抽象是将存在于事物之间共同拥有的元素提取的过程,抽象成类或者接口。抽象分为:   1)数据抽象:用于表示事物的属性,比如人的姓名、年龄等。抽象成属性或者成员变量。   2)过程抽象:用于表示事物的行为,比如人会吃饭等。抽象成方法。 多态:   在面向对象程序设计语言中,多态是继封装和抽象的第三大特性。首先,须清楚多态是一种不能单独来看的特性,它只能作为类中"全景"关系中的一部分,与其他特性协同合作。多态的主要功能是将做什么和怎么做分离开来,从另一角度将接口和数据分离开来。多态不仅能改善代码的组织结构和可读性,还能创建可扩展的程序。   概括来说,多态的作用是消除耦合。没有多态,等号左边和右边需要相互对应,即耦合。有了多态,左边是父类(或者接口),右边是子类(或实现类),我只管调用接口里面的方法就是了,至于你实现类怎么去实现,那是你的事,你要修改一下实现,你只管去把实现类换掉,我这边一行代码都不用变,这就解耦了。 再论向上转型:   把导出类对象的引用视为其基类的引用,这种做法称为向上转型。因为在继承树的画法中,基类是处于上方的。 问题导出:   如果我们只写一个简单的方法,它仅接收基类引用作为参数,而不是写多个以导出类引用为参数的类似方法,并且这个方法对所有的导出类参数都可以正确运行,显然这种做法更好。 问题解决:

读《java编程思想》8-多态

落花浮王杯 提交于 2020-01-14 09:59:34
多态的作用是消除类型之间的耦合关系。(依赖于父类,减少子类耦合) 多态也称为动态绑定、后期绑定或者运行时绑定。 1、什么是多态 (1)将一个”方法调用“同一个”方法主体“关联起来称为绑定。 (2)在程序执行前进行绑定(比如编译时),叫前期绑定, C语言属于前期绑定。 (3)在运行时根据对象的类型进行绑定,叫做后期绑定或动态绑定,即为多态,java中除了static方法和final方法(private方法属于final)之外,其他方法都是后期绑定。即 static方法和final方法没有多态。 (4)任何域访问操作都将由编译器解析,属于前期绑定。即 直接访问成员变量没有多态。注意:这里是指的是通过“点”访问成员变量没有多态,如果调用被覆写过的方法(发生多态),方法内访问的成员变量,则访问的是当前方法体所属类的成员变量。即也发生了多态。 2、通常对象的清理由GC负责,如果有某些资源,需要手动清理,那么新增dispose方法,清理顺序和 初始化顺序完全相反即可。 如果对象成员对象存在共享(如:被当做构造参数传入,增加了引用数量),则需要记录引用计数,每次使用则引用加1,如果引用变为0才允许清理。 3、构造器类似static方法,不具备多态性。但在构造器内调用方法,存在多态,如果调用的是被覆盖的方法。则动态绑定到子类的方法,此时子类还没有被构造,因此即使代码中成员变量有初始化值

Java 封装 继承 多态

感情迁移 提交于 2020-01-14 03:25:27
Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类。 食草动物和食肉动物又是属于动物类。 所以继承需要符合的关系是:is-a,父类更通用,子类更具体。 虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。 类的继承格式 在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下: 类的继承格式 class 父类 { } class 子类 extends 父类 { } 为什么需要继承 接下来我们通过实例来说明这个需求。 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅:属性(姓名,id),方法(吃,睡,自我介绍) 老鼠:属性(姓名,id),方法(吃,睡,自我介绍) 企鹅类: public class Penguin { private String name; private int id; public Penguin(String myName, int myid) { name = myName; id = myid; }

spring相关知识点

淺唱寂寞╮ 提交于 2020-01-14 01:48:25
Spring 概述 ① Spring 是一个开源框架 ② Spring 为简化企业级开发而生,使用 Spring , JavaBean 就可以实现很多以前要靠 EJB 才能实现的功能。同样的功能,在 EJB 中要通过繁琐的配置和复杂的代码才能够实现,而在 Spring 中却非常的优雅和简洁。 ③ Spring 是一个 IOC (DI) 和 AOP 容器框架。 ④ Spring 的优良特性 [1] 非侵入式 :基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API (non-instrusive) [2] 依赖注入 : DI —— Dependency Injection ,反转控制 (IOC) 最经典的实现。 [3] 面向切面编程 : Aspect Oriented Programming —— AOP [4] 容器 : Spring 是一个容器,因为它包含并且管理应用对象的生命周期 [5] 组件化 : Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。 [6] 一站式 :在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上 Spring 自身也提供了表述层的 SpringMVC 和持久层的 Spring JDBC )。 ⑤ Spring

别来无恙 提交于 2020-01-13 21:24:23
1、类 语法:修饰符,class,类名,{}作用域 2、 类的组成: 1、属性(成员属性或者成员变量): 访问修饰符,数据类型,属性名称 分类:1、普通成员变量:堆中 2、类变量:随着类的加载而加载。存储到方法区(static) 3、常量:static final修饰。方法区的常量池中 2、方法: 3、构造器 3、访问修饰符 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × 4、成员方法 5、构造器 1、创建对象 2、通过构造器可以初始化成员属性 3、构造器可以重载 6、创建对象 流程:当通过new构造器之后,会在堆空间开辟一段内存,来保存这个实例,会产生一个引用地址,将来可以将引用地址交给占空间中声明的变量 7、局部变量和成员变量 1、作用域不同 成员变量是在类中声明(类的里面方法外面) 局部变量是在方法内(方法体内或形参列表) 2、存储位置不同 成员变量堆中 局部变量存储在栈中 3、初始值或赋值方式不同 成员变量都有默认值(引用数据类型初始值为null) 局部变量没有默认值(只有显示的赋值才能访问) 来源: CSDN 作者: 音离-命 链接: https://blog.csdn.net/qq_36623595/article