Object类 Object类是所有类、数组、枚举类的父类,即Java允许把任何类型的对象赋给Object类型的变量。当定义一个类没有使用extends关键字为它显示指定父类,则该类默认继承Object父类。 //常用方法: boolean equals(Object obj) protected void finalize() Class<?>getClass() int hashCode() String toString() Java还提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,即得到一个当前对象的副本,而且二者完全隔离。 自定义类实现“克隆”步骤如下: 自定义类实现Cloneable接口。 自定义类实现自己的clone()方法。 实现clone()方法时通过super.clone()。 class Address { String detail; public Address(String d 继续阅读 >>


贺含悦 18/04/13 00:39:52
俯瞰Spring风景线——六大模块 现在逐一介绍Spring的模块~ Spring核心容器(Core Spring container) 容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现。还提供了许多企业服务。 所有的Spring模块都构建于核心容器之上。 面向切面编程(AOP) Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础,与DI一样,AOP可以帮助应用对象解耦。 数据访问与集成(Data access & integration) Spring的JDBC和DAO模块封装了大量样板代码,这样可以使得数据库代码变得简洁,也可以更专注于我们的业务,还可以避免数据库资源释放失败而引起的问题。 另外,Spring AOP为数据访问提供了事务 继续阅读 >>


贺含悦 18/04/12 23:29:00
Spring是什么啊 O_O 春天?emm…我现在所说的Spring是指一个开源框架 PS!!!从现在开始,一定要很熟悉的知道下面这些英文单词首字母组成的简称,后面不再做解释 EJB:Enterprise JavaBean ——企业级JavaBean JDO:Java Data Object ——Java数据对象 POJO:Plain Old java Object ——简单老式Java对象 DI:Dependency Injection ——依赖注入 AOP:Aspect-Oriented Programming ——面向切面编程 Spring到底是什么?它用来干嘛呢? Spring是为了解决企业级应用开发的复杂性而创建 的,使用Spring可以让简单的JavaBean来实现之前只有EJB和其他企业级Java规范才能完成的事情。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型,它增强了POJO的功能。 但Spring不仅仅局限于服务器端开发,任何Java应用都能在 继续阅读 >>


贺含悦 18/04/12 23:28:40
问题引入 我们知道在SQL中,可以用check来来约束字段的范围。 下面这些SQL语句在MySQL下运行(系统环境为deepin 15.5 64位): mysql> CREATE TABLE `Student` ( -> `Sno` char(8) NOT NULL, -> `Sname` varchar(10) NOT NULL, -> `Sex` char(2)NOT NULL DEFAULT '男' CHECK (Sex IN ('男','女')) , -> `Age` tinyint(4) NOT NULL DEFAULT '20' CHECK (Age between 15 and 30), -> `Phonenumber` char(12) DEFAULT NULL, -> `Sdept` varchar(20) NOT NULL, -> PRIMARY 继续阅读 >>


李猛 18/04/12 23:12:35
一、环境与profile 开发环境和QA环境,很多时候需要不同的配置。即在不同的环境中某个bean会有所不同,我们必须用某种方法来配置这个bean,使其在每种环境下都会选择最为合适的配置。其中一种方式是在单独的配置类(或者XML文件)中配置每个bean,然后在构建阶段(可能用到Maven的profiles)确定将哪个配置编译到可部署的应用中。 配置profile bean 利用Spring配置时,需根据环境决定该创建哪个bean和不创建哪个bean,而且Spring是在运行时做出这样的决策。这样的好处是,同一个部署单元能够适用所有的环境,没有必要进行重新构建。 要使用profile,先要将不同的bean定义整理到一个或多个profile之中,再将应用部署到每个环境时,要确保对应的profile处于激活(active)的状态。 在Java配置中,可以用@Profile注解指定某个bean属于哪一个profile。 @Profile(“dev”)该注解应用在类级别上,它会告诉Spring这个配置 继续阅读 >>


李猛 18/04/12 21:40:33
当我们重载了++这个自增运算符,那么在调用他的时候,编译器如何知道我们是调用了前缀自增还是后缀自增呢 #include <iostream> using namespace std; class tmp { private: int a; public: tmp(int b) { a = b; } tmp& operator++(); //这是前缀 const tmp operator++(int); //这是后缀 void show(); }; tmp& tmp::operator++() { this->a += 1; return *this; } const tmp tmp::operator++(int) { tmp old = *this; //先拿到自增前的值 this->a += 1; //再自增 return old; } void tmp::s 继续阅读 >>


吕子健 18/04/11 00:05:45
很多时候,我们需要对已经实现的功能进行扩展,即增加新的功能,那么,最容易想到的就是就是对原有功能进行修改,这个时候免不了要修改原始代码,但面向对象编程的一个思想是开放封闭原则,即: 开放:对扩展开发 封闭:对已实现的功能模块 已实现的功能可以被扩展,不能被修改 需求来了 现在有一个函数 def do(msg): print("do %s..." % msg) 现在要求执行do之前打印一句before do...,执行完之后打印一句end do... 很容易想到这样的做法: def other_do(msg): print('before do...') do(msg) print('end do...') 功能达到了,但是有一个问题,我实际调用的函数已经不是do(msg),而是other_do(msg)了,那么有没有什么别的方法呢? 答案是装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功 继续阅读 >>


李余通 18/04/10 18:20:13
翻译自Spark官网文档,版本:2.3.0 spark内存管理概览 Spark很大一部分内存用于storage和execution,即存储和执行任务。execution memory指的是在shuffle,join,sorts,aggregation操作中使用的内存,storage memory指的是用于整个集群缓存数据和传播中间数据的内存。 spark中storage和execution分享一个统一的区域(M),当没有execution memory被使用,storage可以占用全部可用内存,反之亦然。storage占用execution memory时且有必要时execution可以驱逐storage,直到storage memory使用量低于一个阈值(R)。也就是说R描述了一个小于M的缓存区域,绝不会被驱逐。execution占用storage memory时因为实现复杂所以storage不会驱逐execution。 spark有两个相关配置项: 1. saprk.memory.frac 继续阅读 >>


高朴 18/04/09 23:30:55
今天碰到一个报错 tree.cpp: In function ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’: tree.cpp:81:63: error: default argument given for parameter 2 of ‘merkle_node* createMerkleNode(std::__cxx11::string, bool)’ [-fpermissive] merkle_node* createMerkleNode(string data, bool isLeaf = false) ^ tree.cpp:20:14: note: previous specification in ‘merkle_node* createMerkleNode(std::__cxx11:: 继续阅读 >>


吕子健 18/04/09 20:23:13
/* 因为相乘顺序会影响标量的乘法大小,所以加括号的位置非常影响乘法结果的大小 */ #include<iostream> using namespace std; void matrix_chain_order(int *p,int m[][1000],int s[][1000],int n); void print(int s[][1000],int i,int j); int main() { int p[1000];//存储第一个行,和其他的列 cout <<"请输入要输入矩阵的个数:"; int num = 0 ; cin >> num; int row = 0,column = 0; cout <<"请依次输入矩阵的行和列:"; cin >> row >> column; //因为p[0]要存第一个矩阵的行,之后的p都是存矩阵的列 //这里我刚开始 继续阅读 >>


陈文浩 18/04/09 18:32:03