读书笔记- 一切都是对象

简介:                                   本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!OO与PO:面向对象(Object Oriented)与面向过程(Procedure Oriented)前者面向对象,首先构造一个对象,然后设置对象方法,最后由对象来处理任务,只关注结果。


                                  本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


OO与PO:面向对象(Object Oriented)与面向过程(Procedure Oriented)


前者面向对象,首先构造一个对象,然后设置对象方法,最后由对象来处理任务,只关注结果。

后者面向过程,首先设置对象的方法,然后排序,最后一步步执行下来完成任务,注重顺序。


程序运行时,对象是怎么进行安排的?特别是内存是怎样分配的呢?有五个不同的地方可以存储数据:

1、寄存器。最快存储区,位于处理器内部,数量有限,按需分配,不受控制。使用句柄(引用类型和引用地址)来操作内存。

2、栈。位于RAM(Random Access Memory - 随机访问存储器),通过指针从处理器获得直接支持,内存分配有效性仅次于寄存器;向下移则分配新内存,向上移则释放内存。

3、堆。一种通用内存池(同上位于RAM中),用于存放所有对象,比前者好处是:编译器不需要知道存储数据在堆的存活时间,性比较高,但存储分配和清理会比前者花费更多时间。

4、常量。通常直接存放在程序代码内部,是安全的,永远不会被改变的。嵌入式系统经常把它放在ROM(Read Only Memory)只读存储器里。

5、非RAM存储。数据完全存活于程序之外,不受程序控制,没有程序也照样可以存在,是一种聚合关系,如写在SD卡上的数据。


BigInteger和BigDecimal主要用来表示任意高精度的integer和double数据,商业大数据如阶乘。转化最后用String来表示原始数字,否则会损失精度,而且比较大小也要用compareTo而非equals。由于计算一次就生成一个对象,所以一般的计算建议还用基本数据类型来做。


一个方法里面如String s=new String("str");在方法结束后,s是要消失的,但它声明的对象还留在内存中,由垃圾回收器进行集中管理。


javac编译生成.class文件,java执行让classloader加载class输入执行结果


注意引用与数据是两个概念,不能划等号


位操作符,&同为1则为1否则为0,|有一个为1则为1,同为0才为0


移位操作符,“<<”左移低位补0;“>>"右移 符号为正则高位插入0,为负高位插入1;">>>"无符号右移,无论正负高位插入0;移动赋值如">>="。所以">>与">>>"的区别仅在于负数。


Enum枚举类型,jdk1.5出现,本身是一个类,内部值均为public final static 的,可以方便的用来存储基本数据类型的键值。


匿名内部类的两种实现方式,一种定义抽象类,一种定义接口。

同时注意,内部类中使用的形参必须是final的,因为要跟主类数据同步。

	public static void main(String[] args) {
		Goose goose = new Goose() {

			@Override
			void eat() {
				// TODO Auto-generated method stub
				System.out.println("抽象类goose");
			}
		};
		goose.eat();

		IGoose goose2 = new IGoose() {

			@Override
			public void eat() {
				// TODO Auto-generated method stub
				System.out.println("接口goose");
			}
		};
		goose2.eat();
	}

	static abstract class Goose {
		abstract void eat();
	}

	interface IGoose {
		void eat();
	}


升级排序的应用,Comparable和Comparator,以及Collections.sort和Arrays.sort的使用。

Comparable:应用于类内部,实现此接口,可以直接使用Collections.sort(list)

Comparator:应用于类外部,声明接口,使用Collections.sort(list,comparator)

Arrays.sort应用于数组排序。


	static class Student {
		public int age;
		public String name;

		public Student(int age, String name) {
			super();
			this.age = age;
			this.name = name;
		}

		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return name + "\t" + age + "岁";
		}
	}

	static class Teacher implements Comparable<Teacher> {
		public int age;
		public String name;

		public Teacher(int age, String name) {
			super();
			this.age = age;
			this.name = name;
		}

		@Override
		public String toString() {
			// TODO Auto-generated method stub
			return name + "\t" + age + "岁";
		}

		@Override
		public int compareTo(Teacher teacher) {
			// TODO Auto-generated method stub
			if (this.age > teacher.age) {
				return 1;
			}
			if (this.age < teacher.age) {
				return -1;
			}
			return 0;
		}
	}

	private static void testStudent() {
		System.out.println("testStudent");
		List<Student> list = new ArrayList<>();
		list.add(new Student(18, "A"));
		list.add(new Student(11, "B"));
		list.add(new Student(18, "C"));
		list.add(new Student(19, "D"));
		Collections.sort(list, new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				// TODO Auto-generated method stub
				if (o1.age > o2.age) {
					return 1;
				} else if (o1.age < o2.age) {
					return -1;
				}
				return 0;
			}
		});
		list.forEach(stu -> {
			System.out.println(stu.toString());
		});
	}

	private static void testArray() {
		System.out.println("testArray");
		String[] array = { "BB", "CC", "AA" };
		Arrays.sort(array);
		for (String str : array) {
			System.out.println(str);
		}
	}

	private static void testTeacher() {
		System.out.println("testTeacherList");
		List<Teacher> list = new ArrayList<>();
		Teacher a = new Teacher(118, "AA");
		list.add(a);
		Teacher c = new Teacher(119, "CC");
		list.add(c);
		Teacher b = new Teacher(111, "BB");
		list.add(b);

		Collections.sort(list);

		System.out.println("a 大于 b:" + (a.compareTo(b) == 1));

		list.forEach(stu -> {
			System.out.println(stu.toString());
		});
	}

	public static void main(String[] args) {
		testStudent();
		testArray();
		testTeacher();
	}
testStudent
B 11岁
A 18岁
C 18岁
D 19岁
testArray
AA
BB
CC
testTeacherList
a 大于 b:true
BB 111岁
AA 118岁
CC 119岁
目录
相关文章
|
10月前
|
缓存 算法 Java
《深入理解Java虚拟机》读书笔记(四)--GC的回收条件及Java对象的引用
《深入理解Java虚拟机》读书笔记(四)--GC的回收条件及Java对象的引用
204 0
|
10月前
|
存储 缓存 算法
《深入理解Java虚拟机》读书笔记(二)--对象的创建与空间分配及定位
《深入理解Java虚拟机》读书笔记(二)--对象的创建与空间分配及定位
89 0
|
存储 缓存 算法
深入理解JVM虚拟机读书笔记——对象的创建与内存布局
注:本文参考自周志明老师的著作《深入理解Java虚拟机(第3版)》,相关电子书可以关注WX公众号,回复 001 获取。
深入理解JVM虚拟机读书笔记——对象的创建与内存布局
|
存储 网络协议 安全
读书笔记 之《Thinking in Java》(对象、集合、异常)
一、前言     本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上。     真的感觉,看书是个好习惯啊,难怪人家说“书籍是人类进步的阶梯”。
1116 0
|
C++ 容器 存储
读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
假设你正在操作一个Rectangle类。每个矩形可以通过左上角的点和右下角的点来表示。为了保证一个Rectangle对象尽可能小,你可能决定不把定义矩形范围的点存储在Rectangle类中,而是把它放入一个辅助结构体中,Rectangle中声明一个指向它的指针就可以了: 1 class...
928 0
|
C++
读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
1. 问题的提出:要求函数返回对象时,可以返回引用么? 一旦程序员理解了按值传递有可能存在效率问题之后(Item 20),许多人都成了十字军战士,决心清除所有隐藏的按值传递所引起的开销。对纯净的按引用传递(不需要额外的构造或者析构)的追求丝毫没有懈怠,但他们的始终如一会产生致命的错误:它们开始传递指向并不存在的对象的引用。
914 0
|
C# C++ 编译器
读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针
1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分配的Widget对象上根据进程优先权进行一些操作的函数: 1 int priority(); 2 3 void processWidget(std::tr1::shared_ptr pw, int priority); 注意这里使用了对象管理资源的用法(Item 13),processWidget为它需要处理的动态分配对象Widget使用了智能指针(tr1::shared_ptr)。
840 0
|
C++ 容器
读书笔记 effective c++ Item 13 用对象来管理资源
1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, 1 class Investment { .
997 0
|
C++ 编译器 安全
读书笔记 effective c++ Item 12 拷贝对象的所有部分
1.默认构造函数介绍 在设计良好的面向对象系统中,会将对象的内部进行封装,只有两个函数可以拷贝对象:拷贝构造函数和拷贝赋值运算符。我们把这两个函数统一叫做拷贝函数。从Item5中,我们得知,如果需要的话编译器会为你生成这两个拷贝函数,并且编译器生成的版本能够精确的做到你想做的:它们拷贝了对象的所有数据。
822 0