孙星

20169221 2016-2017-2 《移动平台应用开发》 第二周学习总结

---恢复内容开始---

##解决上周没有成功把代码上传到git的问题 [上传完成](http://git.oschina.net/sunxing27/java-besti-is-sx/commit/5e69839ba9ad58a08493ad7e651a2970ec0f35b7) ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312052059748-13837563.png) ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312052106545-2135720105.png) ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312052121436-1341502332.png) ##《Java和Android开发学习指南》课本学习

---恢复内容结束---

###第四章 1)Java类:创建相同类型的对象的蓝图或模板。写一个类的时候要考虑:类名、字段、方法 [修饰符]class类名{ 类 } 2)字段:基本类型或者对象的引用 3)方法:定义了一个类的对象所能执行的一个动作。有一个声明部分和一个主体,声明部分包含一个返回值、方法名、和参数列表。 方法语法 [返回值] 方法名 ([参数列表]){ //方法 } 4)main方法:提供应用程序的入口点 main方法签名 public static void main(String[] args) java运行一个类的时候可以给main传递参数 java className arg1 arg2 arg3... 5)构造方法:每个类都至少有一个构造方法,不需要返回值,必须与类名一致 ``` /*带有构造方法的 Employee 类 public class Employee { public int age; public double salary; public Employee(){ } public Employee(int ageValue,double salaryValue) { age=ageValue; aslary=salaryValue; } } ``` 6)Vararg:允许方法拥有可变长度的参数列表的java功能 7)创建对象:使用new运算符和类的构造方法来创建对象 8)NULL关键字:引用变量没有值,给它赋一个null满足编译器要求 9)对象的内存分配; -一个完整的Java程序运行过程会涉及以下内存区域: -寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。 -栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。 -堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。 -常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。 -代码段:用来存放从硬盘上读取的源程序代码。 -数据段:用来存放static定义的静态成员。 栈和堆内存分配 >![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224044717-1273624050.png) 1.JVM自动寻找main方法,执行第一句代码,创建一个Test类的实例,在栈中分配一块内存,存放一个指向堆区对象的指针110925。 2.创建一个int型的变量date,由于是基本类型,直接在栈中存放date对应的值9。 3.创建两个BirthDate类的实例d1、d2,在栈中分别存放了对应的指针指向各自的对象。他们在实例化时调用了有参数的构造方法,因此对象中有自定义初始值。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224101498-2026486614.png) 调用test对象的change1方法,并且以date为参数。JVM读到这段代码时,检测到i是局部变量,因此会把i放在栈中,并且把date的值赋给i ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224140389-1975972424.png) 把1234赋给i。很简单的一步。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224156061-430166337.png) change1方法执行完毕,立即释放局部变量i所占用的栈空间。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224223232-1048283961.png) 调用test对象的change2方法,以实例d1为参数。JVM检测到change2方法中的b参数为局部变量,立即加入到栈中,由于是引用类型的变量,所以b中保存的是d1中的指针,此时b和d1指向同一个堆中的对象。在b和d1之间传递是指针。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224257654-777225153.png) change2方法中又实例化了一个BirthDate对象,并且赋给b。在内部执行过程是:在堆区new了一个对象,并且把该对象的指针保存在栈中的b对应空间,此时实例b不再指向实例d1所指向的对象,但是实例d1所指向的对象并无变化,这样无法对d1造成任何影响。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224315826-509989508.png) change2方法执行完毕,立即释放局部引用变量b所占的栈空间,注意只是释放了栈空间,堆空间要等待自动回收。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224336732-1040137237.png) 调用test实例的change3方法,以实例d2为参数。同理,JVM会在栈中为局部引用变量b分配空间,并且把d2中的指针存放在b中,此时d2和b指向同一个对象。再调用实例b的setDay方法,其实就是调用d2指向的对象的setDay方法。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224349076-2040592221.png) 调用实例b的setDay方法会影响d2,因为二者指向的是同一个对象。 ![](http://images2015.cnblogs.com/blog/1115797/201703/1115797-20170312224404764-1155522760.png) change3方法执行完毕,立即释放局部引用变量b。 以上就是Java程序运行时内存分配的大致情况。其实也没什么,掌握了思想就很简单了。无非就是两种类型的变量:基本类型和引用类型。二者作为局部变量,都放在栈中,基本类型直接在栈中保存值,引用类型只保存一个指向堆区的指针,真正的对象在堆里。作为参数时基本类型就直接传值,引用类型传指针。 --引用《[Java内存分配全面浅析](http://blog.csdn.net/yangyuankp/article/details/7651251)》 10)封装和访问控制:java通过访问控制来支持封装。访问控制是由访问控制修饰符来管理的。 类的访问控制修饰符:public 类成员的访问控制修饰符:public protected private -类成员访问级别 修饰词 本类 同一包的类 继承类 其他类 private √ × × × default √ √ × × protected √ √ √ × public √ √ √ √ ... 11)this关键字 -使用this调用本类中的成员变量 -使用this调用构造方法 -使用this引用当前对象 -对象的比较,可以使用this和引用传递进行两个对象是否相等的判断 [深入Java关键字this的用法的总结](http://www.cnblogs.com/whyhappy/p/5370255.html) 12)final变量:在变量声明前加final使其值成为不可修改 13)静态成员:静态成员使类成员,不用先实例化就可以调用。关键字static 14)变量作用域:一个变量的可访问性。是定义该变量的语句块。被嵌套的语句能够访问外围语句块的声明变量 15)方法重载:java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析 16)传值或传引用:对于引用类型,其实参数传递时仍然是按值传递的;当然,按引用传递也不是完全没有道理,只是参考对象不是引用类型本身,而是引用类型所指向的对象。ps:??没看太明白 17)对象创建初始化:Java对象在其被创建时初始化,在Java代码中,有两种行为可以引起对象的创建。 jvm执行操作 -首先,检查这个new指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化。如果没有,则会先进行类加载过程。 -在类加载通过之后,JVM将为新生对象分配内存。对象所需内存大小在类加载完之后便可以完全确定,所以为对象分配空间就是将一块确定大小的内存从Java堆中划分出来 -JVM将对象分配的内存空间初始化为零值, -为该类执行实力初始化和变量初始化 -执行被调用主体的其他主体 -返回一个引用变量,引用这个新对象。 ... ###第七章 继承 1)通过创建一个新的类来扩展一个类。前者后者具备了父-子关系。子类也可以扩展,除非生命为final。继承其实就是自动地共享基类中成员属性和成员方法的机制。 2)extends关键字:扩展一个类 [访问修饰符] class 派生类名 extends 基类名 { 成员列表 } 3)is_a关系:子类和超类之间的关系,子类继承超类所有公有的方法和字段。 4)方法覆盖:扩展一个类时候可以修改一个类的方法行为。 5)调用超类的构造方法:当你创建子类对象时候父类也会实例化。 super关键字:在子类的构造方法中,super关键字可以显式地调用父类的构造方法,用于将参数传递给它; 其一般语法是: super(实际参数)ps:该语句必须是子类构造方法的第一条语句。 6)调用超类的隐藏方法:如果父类和子类中有同名成员,在子类中默认访问是属于自己的那一个成员; super关键字可以明确地指定要访问父类中的成员; 其一般语法是:super.成员名;ps:父类中的该成员不是private的 7)类型强制转换:可以将一个对象转换成另一种类型:upcasting 8)instanceof操作符:测试一个对象是否是一个特定类型,通常在if中使用它。 if("asb" instanceof Type){ //执行代码 }; ###第十章 接口和抽象类 1)抽象类 在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为: abstract void fun(); 抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 [public] abstract class ClassName { abstract void fun(); } 从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别: -抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。 -抽象类不能用来创建对象; -如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。在其他方面,抽象类和普通的类并没有区别。 ... 2)接口   接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下: [public] interface InterfaceName { } 接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。 要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下: class ClassName implements Interface1,Interface2,[....]{ } 可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。 ###第十一章 多态 1)多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。多态存在的三个必要条件 -要有继承; -要有重写; -父类引用指向子类对象。 ... 多态程序实例 ``` public class A { public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A { public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ return ("B and A"); } } class C extends B{} class D extends B{} class E { public static void main(String [] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); //① System.out.println(a1.show(c)); //② System.out.println(a1.show(d)); //③ System.out.println(a2.show(b)); //④ System.out.println(a2.show(c)); //⑤ System.out.println(a2.show(d)); // ⑥ System.out.println(b.show(b)); //⑦ System.out.println(b.show(c)); //⑧ System.out.println(b.show(d)); //⑨ } } ``` 2)反射;Java反射机制是指在运行状态时,可以知道任意一个类的的所有属性和方法,对任意一个对象都可以调用它的任意一个方法;通过反射,可以在运行时实例化对象 Java反射提供的功能包括: 在运行时判断一个对象所属的类; 运行时构造任意一个类的对象; 运行时判断任意一个类的成员变量与方法; 运行时调用任意一个对象的方法; 生成动态代理; 3)多态和反射常常一起使用 ###总结:面向对象的程序设计有三大特征: 封装:解决了数据的安全性问题 继承:解决了代码的重用问题 多态:解决了程序的扩展问题 老师让我们把这几张一起学习就是为了让我们了解java的特性。 ##进度条 学习课本4、7、10、11、5章 练习写代码

posted on 2017-03-13 00:18  20169221孙星  阅读(190)  评论(1编辑  收藏  举报

导航