Java自学笔记(二)

这几天学的内容真是很有料,Java这门语言的核心设计思想,开始慢慢揭开面纱。

话说回来,这两天在看《疯狂Java讲义》的时候,偶尔会对一些问题产生疑惑,而这时候我重新拿起了《Thinking in Java》,我发现这本书现在对我来说,当作一本参考式的资料还是非常不错的,因为里面的内容,真的太丰富了,而且原理级的内容也讲的很到位,打算看完《疯狂》,再把《Thinking in Java》过一遍。

static关键字:

好吧,先说为什么会出现这样的东西。我们说,在描述一个类与其对象的关系的时候,因为对象是类的具体化,所以对象对于的变量应该具有具体的值。而也正是一个个具体的参数,构成类一个具象的对象。但是如果这些对象都拥有一共性呢?这个共性拿什么描述?比如说一个Person类,其中小王很高,小李很矮,但他二人都只有两双眼睛,两只手,都会说话。这样的话,我们就应该把这些共性,也就是作为一个Person都会有的属性,用static来形容。为什么是static?因为只要是static描述的,都会在这个类的对象第一次被创建时,在内存中创立,初始化,接下来再创建对象时,就不会有这部分内容的动作了,所以相比于非static的,它的动作更少,所以叫静态。

用static修饰的,术语叫类XX,因为它是属于类的特性,没用static的,叫实例XX,它们是属于实例的特性。举个例子,比如Person类中有static变量eyecount,非static变量weight。那么我们要用eyecount的时候可以直接Person.eyecount,但也可以xiaowang.eyecount(虽然这种用法不科学,但就是可以);当我们要用weight的时候,可以用xiaowang.weight,此时用Person.weight是坚决不可以的!

总结一下就是:动可用静,动动静静,静不能动。

封装(Encapsulation,面向对象三大特征其一):

我们为什么想要用封装?首先封装可以将问题模块化,使解决问题变得简单;其次封装可以实现对一些关键信息的保护,我只提供你这么多操作,但是想直接摸到那些信息?NO WAY。所以一般封装会隐藏对象Feild、实现细节,而会暴露一些访问Feild的方法。

访问控制符:

private(当前类访问权限)   >   default(包访问权限)  >   protected(子类访问权限)   >   public(公共访问权限)

使用原则:

1.绝大数Feild使用private,少数用static修饰、类似全局变量的Feild用public修饰,工具方法用private。

2.一个类主要作为父类时,多用protected修饰。

3.希望暴露的用public

包(package):

这得好好总结总结。类似于c语言中的那种include一个库函数的功能,但是强大的是,我们可以在原来的库的基础上,做一些自己需要的改动,同时不影响原来的库。包就是包含了一组功能相关的类,组成逻辑上的类库单元。涉及到包的有两个指令。先讲import,这个很好理解,跟include功能类似,相当于扩充了CLASSPATH。

还有一个是package指令,这个非常容易错。当你自己想设计一个库的时候,package就有用了。package后面加包名,其实这个包名非常像一个目录,不过目录的‘/‘变成了‘.‘而已。package后面跟的这个包名,就是当前的类在包中所处的位置。举个例子,我在当前目录java下新建了一个包,叫cer,下面有一个类叫hello.class,那么在hello.class里第一句就是package
cer;算是表明身份,亮出自己的站队。

到了这里还没有结束,接下来涉及到编译。我们编译的时候,怎么编呢?如果我们hello.java文件,是在java目录中创建的,那么我们如果还是用原来的javac hello.java指令的话,结果就是产生的hello.class也在java下,这就不对了。因为我们期望它在cer下。所以这时候应该使用javac -d . hello.java 指令,这样的话,编译器会根据源文件里第一句话package
cer去创建cer目录,然后把hello.class放到cer下。

你以为这样就完了?呵呵,还没有!运行时,你说怎么运行?按理说进到cer下java hello应该可以执行才对,但是人说类,不可以。你只能在当前目录下,也就是java下,输入java cer.hello。当一个类在包中的时候,编译时一定要给出它在包中的相对目录(没错,我想到的就是这个词,相对目录,准确的说应该是包中的相对位置),而且运行时应该处于包所在目录下才行哦。这样就可以根据包的位置,再加上相对位置,准确定位那个类啦。真是规矩一大堆,但是到你编写一个复杂项目时,这肯定能帮你理清文件位置关系。

总结一下就是Java的包机制需要有两方面的保证:1.源文件里使用package语句指定包名;2.class文件必须放在对应的路径下。

继承(Extends,面向对象三大特征其二):

很好理解,class A extends B,就代表着A类继承了B类,A是B的子类,B是A的父类。继承以后,A将拥有所有B的非private的Field和方法。

多态(Polymorphism,面向对象三大特征其三):

这也不难理解,想像你有一个好兄弟,你对他非常了解,也就是他的Feild和方法。当你去看他儿子的时候,你作为他父亲的同辈,必定会以看他父亲的眼光去看他,这就是多态。用程序表示就是:Base pc = new Sub();看到没,就是拿父类引用变量去引用子类对象。这还有种叫法叫向上转型(upcasting)。这在什么时候用呢?举个例子,父类Person,子类xiaowang,xiaoli。假设父类和子类有共同的方法都叫run(),但是子方法有所改变,小王的run,非常快,小李的run非常慢,假如我们的程序不知道要选小王还是小李,那么就应该这样写ChooseOneToRun(Person
p){p.run();}。这样的话不管小王还是小李,都能顺利地run拉!

toString()和valueOf():

这两个是在字符串转换中非常有用的两个方法。toString()方法就是把各种各样类型的数据转换成字符串,这其中还包括引用对象的类型哦,不过在这种情况下,toString()最好自己重写一遍。valueOf()方法可看作是toSrting()方法的逆方法,它把用字符串表示的数据转换成其他类型。比如有个String叫s,内容是“123”,那就可以调用valueOf(),把它转换成int的123。反过来,int的123可以用toString()转换成字符串的“123”。这两个方法很常用。记得上回总结System.out.println()的时候,就说到这个方法在用的时候,先会将变量都转换成字符串的格式,其实就是隐式地调用了toString()方法。

final关键字:

有些量和方法,我们希望定义了一次,它就不能再被定义了,这个时候,我们需要final。作用有点像c语言中的宏定义。需要注意的是final修饰的引用类型的变量,如果我们想让一个对象在定义完后其内容都不变,则需要加上一些其他操作,在此不赘述。final修饰的类不可以有子类,这真是一个断子绝孙的关键字阿!

抽象类abstract关键字:

抽象类中必有抽象方法,抽象方法可以没有方法体。那没有方法体的方法体,要它何用?让子类继承,然后再根据子类的特性,补充所需的方法即可。其实抽象类体现的是一种模板模式的设计,它规定了子类大概要写什么却让子类自己补充完整。这多像咱考四六级时背的作文模板阿!给个大框,抠几个洞,自我发挥。有一点要注意,抽象类不能创建自己的实例。

接口(interface):

接口和一个abstract的类有点像,但它更绝,更抽象,它只能包含抽象方法。接口也不能有实例,但接口可以多重继承,一个接口可以有多个直接父接口。接口体现的是一种规范,对于调用者而言,接口规定类调用者可以调用哪些服务,以及如何调用这些服务;对于实现者来说,接口规定了实现者必须向外提供那些服务。接口里只含有Field和方法,所有的常量、方法都是public修饰,而且Field默认隐式地加上public
static final,所以有的时候你看一个接口,会有一种看到c语言的错觉。

匿名内部类:

因为感觉这个容易犯迷糊,所以多说一嘴。创建匿名内部类时会立即创建一个该类的实例,这就好像是一次性的一个类。你想,以前你定义一个类,它可以实例化出多个实例,但匿名类却是类和实例绑定在了一起,实行一夫一妻制。格式    
new        父类构造器(实参列表)|实现接口()

{//匿名类内部类的类体部分}

枚举类(enum):

有点像c语言中的枚举类型,它限定了这个类实体化以后的对象,必须是它指定的其中一个。好比四季,你不能再举出第五个季节,又好比性别,只有男女。

好的今天内容就到这里。可能有些朋友看了我的文章会觉得:天呐,这是什么东东,考试复习提纲吗?NO,我写这样的总结笔记,更多是为了理清思路,温故知新。可能读起来体验不是那么好,但是过一遍也算是复习吧!欢迎评论指正!

时间: 2024-10-19 19:56:01

Java自学笔记(二)的相关文章

Java自学笔记(三)——输入

因为最近学的内容实际操作比较多,所以新的笔记就用代码为主体吧! 本回主要内容是输入,Java中主要用Scanner类和BufferedReader.总体来说不难,但有些细节可以总结,看代码: import java.io.*; import java.util.Scanner; public class ioTest { public static void main(String[] args) throws Exception { //Scanner提供了多种构造器,不同的构造器可以接受文件

Java学习笔记二:初始化(一)

1.对象初始化 在使用 new 初始化对象时,系统通常使用默认的构造函数,这个构造函数没有返回值,格式为: public class InitializeTest { private int a; // 默认构造函数 public InitializeTest() { } // 自定义构造函数 public InitializeTest(int a) { this.a = a; } } 虽然在使用 new 创建实例时,返回了这个对象的引用,但是这个与没有返回值的void方法不同 //void方法

Java自学笔记(四)—— 集合类总结

今天来总结总结Java集合类.集合类又叫容器类,它封装了很多我们学过的数据结构,这些现成的集合类,实现了各种操作,使用起来非常方便,今天的总结也是以代码为主. 集合大致分为Set.List.Map三种体系.但实际上Java集合类主要由两个接口派生而出,Collection接口和Map接口. Collection接口的子接口: 1.Set,无序,元素不可重复 2.Queue 队列 3.List,有序,元素可以重复 一个个来细说,Set,可以想像成是一个大箱子,里面的东西是无序的,但是有一个条件就是

Java学习笔记二:数据类型

Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围从-2 147 483 6至2 147 483 647 超过20亿,如果用来存储大于20亿的值,最好使用long型. 1.2  int 与Integer: Java中的数据类型分为基本数据类型和复杂数据类型.Int为前者,integer为后者. Integer是int的封装类,提供了很多转换方法,当

Java自学笔记(一)

假期重新拾起Java来学,先是拿来<Think in Java>看,但不幸的是,那本书真心有点生涩乏味.于是上豆瓣寻找到一本李刚老师写的<疯狂Java讲义>,这几天看了一百来页,来总结总结.网上对于此书的评论,捧的大致上说这本书相对于国外教材来说,语言贴近中国人思维,容易理解,而且内容翔实:批的说这本书太罗嗦,让人捉不到重点.实际上,就我这几天的阅读看来,这本书是非常适合我的,在细节方面的解释,以及在底层原理的揭示,在我看来,正是学习一门新语言不可或缺的东西. 对于像我这样从汇编语

java读书笔记二

这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向对象是以对象为中心,先有类,得到对象,通过对象之间相互通信实现功能,面向过程是先有算法,后有数据结构, 而面向对象是先有数据结构,然后再有算法. 然后就是一些重要的: main方法是静态的. Public static void main(String[] args) 源代码的文件名必须与公有类的名

Java学习笔记二(基础语法)

1 Java 是强类型语言,提供的8中基本数据类型有以下几类: Byte :字节类型,一个字节,有符号的8位的整数.字节类型参与运算的时候,会转化为int类型. byte b;b=3;b=(byte)(b*3);  在这里第二个赋值必须经过强制类型转化,否则会编译出错. short:2个字节,Byte可行可以直接赋值给short,但是反过来需要强制类型转化. int:4字节类型的有符号的整数. long:8个字节类型的有符号的整形 char:2个字节的无符号的类型.采用的是Unicode的编码格

数组排序、递归——(Java学习笔记二)

升序: 选择排序: 选定一个元素,一次和后面的元素相比较,如果选定的元素大雨后面的比较元素,就交换位置 先出现最小值,最后出现最大值. public static void main(String[] args) { int[] arr = {5,8,9,12,55,565,421,12,2512,-5,-56}; sortMethod(arr); p(arr); } //排序核心代码 private static void sortMethod(int arr[]) { for(int i =

Java自学笔记(第五天)面向对象--char[]和String--封装--构造函数--this

//面向过程的思想就是只有动词,面向对象的思想就是名词+动词 冰箱.打开 冰箱.存储 冰箱.关闭 //名词提炼法 //面向对象的三个特征:封装,继承,多态 (*)类和对象的关系 类:对事物的描述(属性,行为)(成员变量,成员方法) 对象:事物实体(值,具体做法) /* (*)(*)Java中没有string关键字,而String是字符串类 (*)(*)char[]和String互转: */ //对象.对象成员 //每个new都生成一个新对象,并在堆内存中分配空间 (*)成员变量和局部变量 成员变