发表于: 2018-03-25 21:31:55
2 470
小白学Java第十二天,今天学习时间7-8小时
今天进行了基础学习,都是干货
今天完成的事情:
1.对象和类
JAVA中对象的含义非常广,JAVA是一种面对对象的编程,我觉得对象在JAVA中要根据程序具体的适用情况,对象简单来说具有属性和方法,属性就是对象的各项数据,我举一个简单的例子,比如要设计一个与动物相关的JAVA,这时候鸟可以作为对象,它的属性可以有羽毛颜色,品种,大小等,而方法就是飞、捕食,等等,许多不同种类鸟可以构成一个类,许多狗也可以构成一个类,但是狗这个类中却不可能包含一个鸟的对象;但是如果设计一个生物相关的JAVA,却可以有一个动物类和植物类,那么狗和鸟这两个对象却又可以同属于一个类,不道这样理解是否正确。
2.JAVA中的数据类型
简单来说JAVA有8个数据类型,分别是:boolean、byte、char、short、int、float、douboe、long。其中六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型,四个整数型有8位、16位、32位、64位,两个浮点型其实就是小数,也是位数不同。
byte 字节:byte是JAVA中最小的数据类型,它在内存中占8位(8个bit),取值范围从-128到127
short 短整型:short类型在内存中占2个字节,取值范围从 -32768到32767
char 字符型:char类型在内存中占2个字节。表示一个字符,也可以使用ASCII码范围内的值来给char型的变量赋值。由于字符在内存中的取值不存在负数范围,所有取值范围从 0 到 65535
int 整型:int型在内存中占4个字节。取值范围从 -2147483648 到 2147483647
float 单精度浮点型:float型在内存中占4个字节。取值范围从 -3.4E38 到 3.4E38
long 长整型:long型在内存中占8个字节。取值范围从 -9223372036854775808 到 9223372036854775807
double 双精度浮点型:double 型在内存中占8个字节。取值范围从 -1.7E308 到 1.7E308
boolean 布尔型:boolean类型只有两个值:true和false。
3.包的概念
类似于文件夹,包主要有三个主要作用,第一,把杂乱无序的类分开存放,第二,不同包
里面可以有相同名称的类,这样可以扩大类的命名空间,第三,可以限制同一包之间的类才能相互存取
以增加安全性。
4.修饰符
1>public 成员变量可以被项目中的任何方法访问,建议尽量少用
2>protected 不在同一个包中的类不能访问,但子类可以访问
3>private 只能在同一个类中使用
4>static 类变量,其值为该类的所有对象共享,不会因类的对象不同而不同
5>final 最终成员变量,其值保持不变,即常量
6>transient 当对象被持久化时(例如写入数据库),该成员变量的值不需要保存
7>volatile 同步多线程访问的成员变量的值,以便使不同的线程总是得到该成员变量的同一个值。
5.接口
简单来说我觉得就是因为类只能有一个父类,那么这个类可以继承父类中已有的方法,但是要是想往已有类中增加一个方法呢?最简单的方法就是给他找一个父类,那么要是父类也有了自己的父类呢?就需要一级一级的往上找,而JAVA是一种面向对象的编程,这个时候把类看做对象,既然他需要方法,那么我们就给他加一个,于是接口就应运而生。
6.学习了构造方法
单个函数构造方法
运行结果如下
多个函数构造方法,有参数和无参数
结果如下
多个函数构造方法,有个别参数构造方法如下
7.java的封装
封装可以认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。提供公有的getter和setter来控制存取动作。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点:1. 良好的封装能够减少耦合。2. 类内部的结构可以自由修改。3. 可以对成员变量进行更精确的控制。4. 隐藏信息,实现细节。
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,
public方法是外部类访问该类成员变量的入口。通常情况下,这些方法被称为getter和setter方法。因此,任何要访问类中私有成员变量的类都要通过这些getter和setter方法。
注释:以name为例
setName 顾名思义就是给name设置一个值,也就是通过外部调用该方法给EncapTest的对象中的name赋值,所以外部方法肯定需要传入一个String作为参数。而this.name=name; 便是赋值的部分了,赋值之后不需要有返回值。
getName顾名思义便是得到name的值,也就是通过外部调用该方法得到EncapTest对象中的name的值,所以这个方法肯定要有个返回值才行,而return this.name;便是返回的部分了
通过如下的例子说明EncapTest类的变量怎样被访问:
结果如下:
8.继承
子类可以继承父类的方法,自动获得父类的功能,并且这种继承并不是一定不变的,在需要的时候可以覆盖从父类获得的方法,重新定义,一般来说,子类总是比父类更加具体,且一个父类可以有多个子类,但每个子类只能有一个父类,子类只能重新定义从父类获得的能力,却不能自己添加新的方法, 要是需要增加新的方法,就要用到接口。例如
运行结果如下:
在T1的主方法中只调用子类构造方法,实例化子类对象并且在子类构造方法中,没有调用父类的构造方法的任何语句。但是在实例化对象时,它相应的调用了父类构造方法,在结果中还可以看到调用构造方法的顺序,首先是顶级,再继续往下直达本身类。也就是说实例化子类的时候,要首先实例化父类对象,然后在实例化子类对象,所以在子类构造方法调用父类构造方法前,父类已经实例化了。
9.成员变量和局部变量
成员变量:在类体里面定义的变量叫做成员变量;如果在变量有static关键字修饰,就叫作静态变量或类变量;如果该变量没有static关键字修饰,就叫作非静态变量或实例变量;
局部变量:(局部变量只能在该类下的方法内使用)方法内定义的变量、形参、代码块中定义的变量都叫做局部变量;
另外,成员变量可以不显式初始化,它们可以由系统设定默认值;局部变量没有默认值,所以必须设定初始赋值。两类变量同名时局部变量更有优先级。还有,在内存中的位置也不一样。成员变量在所在类被实例化后,存在堆内存中;局部变量在所在方法调用时,存在栈内存空间中。(已经通过自己的代码进行验证,详见下面内部类)
10.static之静态变量
java中被static修饰的变量成为静态变量。可以使用类名和对象名进行调用。静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收
11.静态方法
1>静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员;如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量
2>在普通成员方法中,则可以直接访问同类的非静态变量和静态变量
3>静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法
注:静态方法是属于类的,内存必须为它分配内存空间,这个空间一直由静态方法占用,内存管理器不会由于静态方法没有被调用而将静态方法的存储空间收回,这样如果将所有的方法都声明为静态方法,就会占用大量的内存空间,最后是系统变慢。而普通的成员方法是由对象调用的,内存并不会一直为起分配内存,只有调用的时候才为其分配存储空间,而当其没有被调用时,存储空间就会被内存管理其收回,释放没有用的空间,提高的系统的运行速率.
程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。
静态初始化块只在类加载时执行一次,且只能初始化静态成员变量,不能初始化普通变量
思考:为什么要有初始化?
初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块初始化了。
好处是可以提高初始化块的复用,提高整个应用的可维护性。
12.java中的内部类
作用:提供更好的封装,不允许同一个包中其他类访问该类。内部类可以直接访问外部类的所有数据,包括私有数据
内部类的类型:常规内部类(成员内部类)、静态内部类、局部内部类(方法内部类)、匿名内部类
1.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中。常规内部类中的方法可以直接使用外部类的实例变量和实例方法。在常规内部类中可以直接用内部类创建对象
注:x++和++x 两者区别: 如果单独作为一条语句的话,并没有区别例如 x++;和++x;没有任何区别 如果作为一个表达式;前者表达式值为x,然后x自身+1;后者表达式值x自身+1以后的x值, 例:x=1; a=x++;这里a结果是1;x是2; x=1;a=++x; 这里a结果是2, x结果也是2
2.静态内部类:与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。静态内部类与静态内部方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量,与实例方法,只有通过对象引用才能访问。由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,但是可以访问外部类中的static成员。这与一般类的static方法相通
3.局部内部类:在方法体或语句块(包括方法、构造方法、局部块或静态初始化块)内部定义的类成为局部内部类局部内部类不能加任何访问修饰符,因为它只对局部块有效。
局部内部类只在方法体中有效,就想定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象
在方法内部定义类时,应注意以下问题:
a.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和 abstract修饰
b.方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。
c.static方法中定义的内部类可以访问外部类定义的static成员
注:+" "+是空格 "\n"是换行
4.匿名内部类:定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类,以这种方法定义的没有名字的类成为匿名内部类。
声明和构造匿名内部类的一般格式如下:
new ClassOrInterfaceName(){
/*类体*/ }
匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。
由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不能使用关键字来创建该类的实例。实际上匿名内部类的定义、构造、和第一次使用都发生在同样一个地方。此外,上式是一个表达式,返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量。
明天计划的事情:(再学点基础的代码,完成jdbcTemplate,继续完成任务)
遇到的问题:(最后一个匿名内部类没有进行理解,就摆上来了,因为太累了,明天早上进行理解,对代码的部分进行深度消化记忆)
收获:(
1-12的目录一个项目不同的包)
今天对基础进行了恶补呀....都是干货.以及代码.码了这么多,劳烦师兄批阅了。
评论