编程思想

Java编程思想学习笔记(6)

♀尐吖头ヾ 提交于 2019-12-27 00:08:49
Java编程思想学习笔记(6) 引入访问控制权限 当你有更好的方式去实现系统中的一个部分时,可能会遇到一些问题。因为客户端程序员希望你的代码在某些方面保持不变,所以这个时候就会有冲突了。“如何把变动的事物与保持不变的事物区分开”。 为了解决这个问题,Java提供了访问控制权限。 从最大权限到最小权限依次为:public,protected,包访问权限(无关键词),private public 使用关键字public,意味着public之后的成员声明自己对每个人都是可用的。 在d1包下定义类A: public class A { public A(){ System.out.println("A构造器"); } void f1(){ System.out.println("f1"); } public void f2(){ System.out.println("f2"); } } 在同一个包下使用: public class Use_A { public static void main(String[] args) { A a = new A(); a.f1(); a.f2(); } } 完美运行 在不同包下,d2包中使用: public class Use_A { public static void main(String[] args) { A a = new A(); /

《Java编程思想》第十三章 字符串

£可爱£侵袭症+ 提交于 2019-12-22 00:41:17
可以证明,字符串操作是计算机程序设计中最常见的行为。 不可变String String对象是不可变的。例如: public class Immutable{ public static String upcase(String s){ return s.toUpperCase(); } public static void main(String[] args){ String q = "howday"; print(q); String qq = upcase(q); print(qq); print(q); } } howday HOWDAY howday 当把q传给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用指向的对象其实一直待在一个单一的物理位置上,从未动过。 重载“+”与StringBuilder 操作符+号可以用来连接String。当你为一个类编写toString方法时,如果字符串操作比较简单,那就可以信赖编译器,但是,如果要在toString的方法中使用循环,那么最好自己创建一个StringBuilder对象,用它来构造最终的结果。 无意识的递归 Java中的每个类从根本上都是继承自Object,标准容器类自然也不例外。因此容器类都有toString()方法,并且覆写了该方法

Java编程思想14章类型信息笔记

你。 提交于 2019-12-19 01:35:43
笔记思路:整理的文章全面重点,有些已经理解的含义只是简单提起,不太好理解的进行重点总结。主要是建立一个框架 14.1 RTTI & 14.2Class对象 RTTI:Run-Time Type Identification 运行时类型信息使得我们可以在程序运行时发现和使用类型信息 类是程序的一部分,每个类都有一个Class对象,每当编写并编译了一个新类,就会产生一个class对象(保存在一个同名的.class文件中),JVM此时会使用被称为"类加载器"子系统。 Java程序在它开始运行之前并非完全加载,当程序创建第一个对类的静态成员的引用时,才会加载这个类。 过程:类加载器首先检查这个类的class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找class对象。 paf书中的350页有具体解释 Class.forName()方法 输入:包含目标类的文本名的String作为输入参数,必须是全限定名 输出:一个Class对象的引用 如果找不到,会抛出ClassNotFoundException异常。 getName() 产生全限定类名 getSimpleName() 产生不包含包名的类名 getCanoicalName() isINterface() 返回Class对象,在Class对象中所包含的接口 getInterfaces getClass() Class

如何用函数表示数(四)数的彻底消失

时光怂恿深爱的人放手 提交于 2019-12-17 21:35:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 之前的只是开胃小菜,在确保你能弄懂前面的代码例子后再来看这个。这个能弄懂表示你已经彻底搞懂了闭包是怎么回事了。 前面的例子中,我们最终还是需要一个数来表示一个起始的数。那么还没有完全达到我们的目的。但是如果要完全用函数来代替数,我们又怎么证明一个函数确实是表示那个数呢? 为此,我们需要先考察一下数到底是怎么回事。 想想最原始的表示数的方法:用指头数数,当10个指头数完了,数就到头了,如果你是一个牧羊人,有超过十头的羊,还可以用来表示比10更大的数。但是当人类想明白5个指头和5头羊之间的联系是什么的时候,他们就不用再用5头羊或5个指头来表示5,而只要说出数字5的符号就可以了,这时人类完成了一次抽象概念提取的过程。 因此,最原始的数的概念:一个数就是表示一件事物重复的次数。 想象一个在完全只有函数,而没有数的世界里,怎么计数?方法就是, 对这个函数传入一个函数执行(注意,没有数了),这个函数的内容被执行N遍,就表示执行这个函数的函数代表的是N这个数了。 因此,假设有一个函数能代表0 zero = f(x) 还有一个函数能代表加1 incr = f(x) 那么1就能表示为 one = incr(zero) 2表示为 two = incr(incr(zero)) 更多的数表示为 three = incr( incr

《Java编程思想》第十二章 通过异常处理错误

一世执手 提交于 2019-12-17 17:02:25
java的基本理念是“结构不佳的代码不能运行” 。 发现错误的理想实际时在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决,这就需要错误源能通过某种方式,把适当的信息传递给某个接收者-该接收者知道如何正确处理这个问题。 改进的错误恢复机制是提供代码健壮性的最强有力的方式。Java使用异常来提供一致性错误报告模型,使得构件能够与客户端代码可靠地沟通问题。 基本异常 异常情形是指组织当前方法或作用域继续执行下去的问题。把异常情形与普通问题向区分很重要,所谓的普通问题是指,在当前环境下能得到足够的信息,总能处理这个错误。而对于异常情形,就不能继续下去了,因为当前环境下无法获得必要的信息来解决问题。你所能做的就是从当前环境跳出,并且把问题提交给上一级环境。这就是抛出异常时所发生的事情。 当抛出异常后,有几件事情会随之发生。首先,同Java中其他对象的创建一样,将使用new在堆上创建异常对象,然后,当前的执行路劲被终止,并且从当前环境中弹出对异常对象的引用,此时,异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。这个恰当的地方就是异常处理程序,它的任务时将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续运行下去。抛出异常,看起来像这样: if(t == null) throw new

Android MVP-编程思想1(什么是MVC-MVP-MVVM模式?)

帅比萌擦擦* 提交于 2019-12-16 03:39:13
前言 通过一个小的登录功能模块案例,帮助大家了解MVP。最终实现一个结合Rxjava2,Retrofit 的MVP通用框架。代码放到 github 上。 (如有错误之处,请在评论区指出,谢谢。如果感觉写的不错,请点赞,关注,谢谢。) 目录: Android MVP-编程思想1(什么是MVC-MVP-MVVM模式?) Android MVP-编程思想2(代码实现初级版) Android MVP-编程思想3(内存泄露问题处理,基类封装,有没有必要再使用软引用?) Android MVP-编程思想4(AOP思想-动态代理运用,反射创建M层实例对象) Android MVP-编程思想5(如何处理多个P层的问题?) Android MVP-编程思想6(依赖注入多个P层优化—注解,反射) Android MVP-编程思想7(为什么使用代理类抽取通用方法而不是工具类?,基类BaseMvpFragment) 未完待续-------- Android MVP-编程思想8(集成Rxjava2,Retrofit) 先讲一下mvc M-数据层:数据库,网络数据 V-视图层:layout,自定义view C-控制层: 一般是Acitivity,Fragment(处理业务逻辑) 实际上在MVC在andorid开发中很难区分Activity到底应该处于V还是C的角色

《Java编程思想》第八章 多态

纵饮孤独 提交于 2019-12-15 16:00:02
在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。“封装”通过合并特征和行为来创建新的数据类型。多态也成为 动态绑定 , 后期绑定 或 运行时绑定 。 再论向上转型 对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。而这种把某个对象的引用是为对其基类型的引用的做法被称为向上转型。 传记 方法调用绑定 将一个方调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定,叫做 前期绑定 。 后期绑定 就是在运行时根据对象的类型进行绑定。后期绑定也叫做动态绑定或运行时绑定。Java除了static方法和final方法外,其他所有的方法都是后期绑定。 例如,有一个基类Shape以及多个导出类—Circle,Square,Triangle。 向上转型的经典语句就是: Shape s = new Circle(); 这里,创建一个Circle对象,并把得到的引用立即赋值给Shape,这样做看似是错误的,但实际是没有问题的,因为通过继承, Circle 就是一种 Shape 。 缺陷:“覆盖”私有方法 public class PrivateOverride{ private void f(){print("private f()");} public static void main

编程思想 -- 第20章 -- 注解

六眼飞鱼酱① 提交于 2019-12-13 22:02:49
注解 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。 注解在一定程度上把元数据与源代码文件结合在一起,而不是保存在外部文档中这一大的趋势之下所催生的。同时,注解也是对来自像C#之类的其他语言对Java造成的语言特性塔里所作出的一种回应。 注解可以提供用来完整描述程序所需要的信息,而这些信息是无法用Java来表达的。注解可以使我们能够以将由比编译器来测试和验证的格式,存储有关程序有关的额外信息。注解的优点:更加干净易读的代码以及编译器类型检查。 三种标准注解:@Override 重写;@Deprecated : 发出警告;@SuppressWarnings 忽略警告 一、基本语法 注解的语法比较简单,除了@符号的使用外,它基本与java固有的语法一致。注解并不做任何事情,但是编译器要确保在其结构路径上必须有注解的定义。 注解的定义看起来很像接口的定义,事实上,注解也会编译成class文件。定义注解时需要一些 元注解,@Target用来定义注解用于什么地方,@Retctetion用来定义注解在哪一个级别可用,在源代码中(Resource),类(Class)或者运行(Runtime) 没有元素的注解称为标记注解。注解的元素开起来就像接口的方法,唯一的区别是你可以为其指定默认值。 java目前只内置了三种标准注解

编程思想之IOC与DI

被刻印的时光 ゝ 提交于 2019-12-12 00:48:12
什么是IoC IoC(Inversion of Control),即控制反转,不是什么技术,是面向对象编程中的一种编程思想,可以用来降低代码之间的耦合度。 在JAVA中,当我们需要使用一个对象的时候,传统的方式是 Lang lang = new Lang(); 而IoC意味着将你设计好的对象交给容器控制,而不是在你的对象内部直接控制。 举个通俗易懂的例子,网约车出现以前我们是如何叫车的?这能站在路边,招手,叫出租车。还要考虑是否在高峰期,你站的路段会不会有出租车经过,这个过程是麻烦的。传统的程序开发也是如此,在一个对象中,如果想要使用另外一个对象,就必须得到它,自己new一个,有些对象使用完还要将其销毁,比如Connection等。对象与其他接口或类耦合度高。 此时,滴滴这样的网约车平台出现了,所有想载客的私家车在滴滴登记服务类型,身份信息。此时你再想叫车,只需要坐在家里打开APP输入目的地,选择服务类型,滴滴自动安排一个符合要求的车到你面前,为你服务,方便,完美! IOC容器就好比是滴滴,所有的类都会在IoC容器中登记,告诉IoC容器你是个什么东西,你需要什么东西,然后IoC容器会在程序运行到适当的时候,把你需要的东西主动给你,同时也把你交给需要你的东西。 深入分析: 谁控制谁,控制什么: IoC容器控制了外部资源获取,外部资源不仅指对象,还包括文件等

Java编程思想 练习题(三)

浪尽此生 提交于 2019-12-11 16:09:05
一、写一个程序打印1到100的值。 public class Main { public static void main(String[] agrs) { int i = 0; while (i < 100) { System.out.print(++i + ","); } } } 返回: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100, 二、写一个程序,产生25个int类型的随机数。对于每一个随机值,使用if-else语句来将其分类为大于、小于,或等于紧随它的而随机生成的值。 public class Main { public static void main(String[] agrs) { Random random = new Random()