第二讲:数据类型、面向对象
导读
学习任何一门计算机编程语言,首先要了解的内容便是它的数据类型。
java语言中把数据类型分为2种,基本数据类型和有数据类型。
主要内容
基本数据类型和引用数据类型
计算机内存单位
变量和常量
数据类型
通俗的讲,数据类型是用来描述数据是什么类型的,比如“123”是数值类型,“abcd”是字符串类型,“A”是字符类型,“$”是符号类型。
数据类型的定义
如何描述信息?
数字“13”、“200”,姓名“张三”、“computer”,编号“APTX4809”,字符“A”、“B”,符号“$”、“&” 等文字信息,有的是数字类型的,有的是中文类型,有的是英文类型,还有的是单个字符,还有是特殊符号。
为了描述不同的数据内容,采用相应的数据类型,比如数字类型和字符类型。java 中整理了一些基本数据类型,用来描述上述的内容信息。分门别类的方式把描述不同的数据内容,采用对应的数据类型,一一对应起来,记录和使用起来是不是特方便。java 中的基本数据类型有8种。除了基本数据类型外,其他的数据类型统一当做引用数据类型对待。
PS: 计算机只能识别二进制,也就是0和1,任何文字内容和计算机打交道都要转换成二进制。
Java 是一种强制类型的编程语言,变量都必须先明定义再使用。
基本数据类型
基本数据类型的分类
java编程语言的8种基本数据类型
char 表示单个字符的。
byte short int long 表示数值的
float double 表示数值中的带小数
boolean 布尔类型,表示真和假
ps : char 代表字符型,实际上字符型也是一种整数类型,相当于无符号整数类型。
计算机内存的单位
比特
bite 比特是计算机的最小存储单位,一个比特位上只能存放0或者1 。
字节
8个bite就是一个字节,byte 。
1Byte = 8bit
1KB = 1024Byte
1MB = 1024KB
1G = 1024MB
1T = 1024G
正数、负数如何表示
思考: 如何区分正数和负数呢?
是不是要有一个标识啊,就像书写的时候 1 和 -1 ,负号就是表示,正号只是发表书写省略了。
左面第一位当做符号位使用,0 表示正数 ,1 表示负数。这样是不是就能表示出正数和负数了。所以使用二进制来表示数值,有2种,有符号和无符号,有符号可以表示正数也可以表示负数,而无符号默认是表示正数(如果强制约定它表示负数也是没有问题的,记住一个词,“约定”)
取值范围
无符号场景:
有几个比特位置,比如有4个比特,如下 :
它的取值范围就是 0000 ~ 1111 。
有符号场景:
同理,只不过最高为是符号位置。
它的取值范围 1111(它是一个负数) ~ 0111(它是一个正数) 。
进制以及进制间的转换
二进制
十进制
八进制
十六进制
十进制和二进制的转换
ps : 自行去拓展,网上一抓一大把 。
基本数据类型的取值范围
引用数据类型
引用数据类型,除了基本数据类型外,都是引用数据类型。具体包括类、接口、数组。引用数据类型是建立在基本数据类型之上的,由用户(程序员)自己定义,来限制基本数据类型。
// 类 class 就是引用数据类型
public class MyData{
}
// 接口 interface 也是引用数据类型
public interface Service{
}
// 数组 arrar [] 也是引用数据类型
int [] array = new int[8];
引用数据类型中有2个特殊存在,但它们也都包含在引用数据类中。
null 空类型
void 空返回
变量
变量的定义语法:
修饰符 数据类型 变量名 ; 如 public int size=10;
变量名的命名规范:
区分大小写,可以是数字、字符、$、下划线_ , 不能以数字开头,不能是java的关键字(保留字)。
变量的默认值
char 类型的默认值是空字符串 "" 。
int short long 类型的默认值是 0 。
float double 类型的默认值是 0.0 。
boolean 类型的默认值是 false 。
引用数据类型的默认值是 null 。
关键字(保留字)
数据类型的使用
数据类型的使用,是用在变量定义的地方,以及类、接口、数组的定义。
变量的声明定义,必须有数据类型约束,这是java语言的规范。
在不同位置定义的变量,它的作用范围也就不同。如成员变量,它的作用范围是在整个类中;再如局部变量,在方法中定义,可以是方法体中,也可以是方法的形参中,它的作用范围之内在当前方法中。
变量的分类
成员变量
在类中定义的变量。
public class M{
// 成员变量
private int size;
}
局部变量
在方法中定义的变量。
public class M{
// size 以及f 都是在方法中定义的变量,叫局部变量
public void m(int size){
boolean f;
}
}
静态变量
在类中定义,并且使用 static 关键字修饰的变量
public class M{
// count 在类中定义,并且是被 static 修饰的 属于静态变量
private static long count=0L;
}
public interface Service{
// 接口中的省略修饰符为 public static
long onlineCount=0L;
}
常量
在类、接口、方法的形参中定义,并且使用 final 关键字修饰。final 变量一旦被定义,在程序执行中是不可更改的。
public class M{
// 常量推荐使用大写
public static final LIMIT =10L;
public int add(final int a, final int b){
return a+b;
}
}
ps : 数据包装类、Object 类、String 类,日期和时间类,可以在了解类的定义和使用之后,回头再来看。
数据包装类
自动装箱、拆箱机制
Object 类
java.lang.Object
String 类
String 类在实际的编程设计工作中被用到是最频繁的一个类。String 表示字符串。
String name="工藤优作";
String job="推理小说家";
日期、时间 类
数据类型的转换
数字10,可以使用 byte 类型表示,也可以使用 short 类型表示,还可以使用 int long 类型表示。
把 byte 类型表示的变量,转换成使用 int 类型表示的变量(把byte类型的值赋值给int类型的变量),像这样的使用把A类型的变量,赋值给B类型的变量的方式叫类型转换。
首先要有个概念,基本数据类型表示的范围依次放大的 char byte short int long(把左面叫做小,右面叫做大)。
隐式转换
隐式转换,也叫自动转换,把小类型转换成大类型,如把int类型的变量赋值给long类型的变量。
int x=10;
long t=x; // 隐式转换
显示转换
显示转换,也叫强制类型转换,把大类型转换成小类型,如把long类型的变量赋值给int类型的变量。
long t=10L;
int x = (int) t;
数据类型转换注意事项
1、取值范围越界
byte 的取值方位是 -128 ~ 127 。把 int 255 赋值给 byte,会出现什么问题?
byte i = 126;此时给i 加10,会出现什么情况?
2、精度问题
3、大数字的表示
推荐使用jdk 的 BigDecimal 工具类。
字符串和其他对应的数据转换
字符串和数值的转换
int i=200;String s=“1”; 把 i 赋值给 s。
方式一: 加上一个""。
int i =10;
String s = i+"";
方式二:使用String.valueOf()方法
int i=10;
String s=String.valueOf(i);
ps : String#valueOf方法是一个重载方法。具体方法签名如下:
字符串和日期
面向对象
切入
思考,如何描述上图中的人物信息。
思考维度: 比如肤色、性别、姓名、身高等。
人物介绍 | |
---|---|
姓名 | 娜美 |
性别 | 女 |
身高 | 170cm |
体重 | 58KG |
职业 | 航海士 |
婚姻 | 未婚 |
年龄 | 未知 |
再来描述下图中人物信息:
姓名: 工藤有希子 性别:女
人物介绍 | |
---|---|
姓名 | 工藤有希子 |
性别 | 女 |
身高 | 165cm |
体重 | 58KG |
职业 | 演员 |
婚姻 | 已婚 |
年龄 | 未知 |
美术学上,可以通过肖像的方式描述人物;文学上可以通过多维度信息项的方式描述人物。那么计算机编程语言学上,是不是也可以通过类似的方式描述人物信息啊。
类
类 class,是通过抽象的思维,描述一类事物,如描述一个人物,描述一把冷兵器。
类的概念思考:有生命的可以抽象成类,比如人类,哺乳动物类,猫科动物类;无生命的也是可以抽象成类,如桌子、椅子、茶杯。再换一个维度思考,具体的物件可以抽象成类,如电脑、手机;非具体的、抽象的也是可以抽象成类,比如年龄、
类的语法定义
修饰符、class关键字、类名称以及一对花括号组成类的整理结构。
其中,在类的内部结构中,还包含成员属性以及行为方法。
public class Human{
public String name;
public String sex;
public float stature;
public float weight;
public String occupation;
public boolean marriage;
public int age;
}
成员属性
行为方法
对象拥有的行为能力。实现方式就是方法,函数。
访问修饰符 返回值 方法名 {} 组成,在类中定义。
访问修饰符
访问修饰符,控制类、成员属性、行为方法的访问作用域。
- private
- protected
- public
- default 等价于 protected
private 、protected 、public 3个维度。其中private 在当前类中访问,protected 在同一个包下可以访问,public在整个项目工程中都可以访问。
默认的访问修饰符(省略不写),等价于protected 。
访问修饰可以修饰成员变量,可以修饰行为方法。
对象
对象 指的是一类事物中的具体一个,比如工藤有希子,就是其中一位。娜美是其中另一位。
类和对象的关系
类表示的整体,是一类事物,而对象是这一类事物中的具体一个。它们之间的关系是 is-a 关系。
类,进行实例化得到的结果就是对象。通过类得到对象的过程叫实例化。
类的具体说明
普通类
普通类可以实例化。
public class C{}
抽象类
抽象类,不可以实例化,需要通过它的子类进行实例化。
public abstract class AbstractBeanFactory{}
内部类
在类中定义类。
public class C{
private class Inner{}
protected class Inner1{}
public class Inner2{}
}
静态内部类
在类中定义类,并且再使用static 关键字修饰。静态内部类是建立在内部类的基础上的,使用static 关键字修饰。
public class C {
public static class Inner3{}
private static class Inner4{}
}
终类 类的访问修饰符上使用final。终类是不能被继承的。
public final class String{}
行为方法的具体说明
普通方法
普通方法,是在普通类中声明定义,而且必须是通过类实例化的对象才能访问。
public void m{}
抽象方法
相较于普通方法,抽象方法没有方法体,只有声明定义,而且只能定义在抽象类或者接口中。
public abstract void m();
私有方法
私有方法,在类中定义,只是它的访问修饰符是private。
private void m(){}
静态方法
对比普通方法,静态方法的访问可以直接通过类,不实例化。
public static void m(){}
private static void m1(){}
方法的形参和实参
方法形参,方法定义的参数叫形参。
实参,方法在运行过程中,实际赋值给形参的值为实参。
面试题-普通类和抽象类的区别
做区别比较的问题是,是要找出相同点和不同点,从不同的维度上去分析。普通类和抽象类的对比分析维度,修饰符、普通方法、抽象方法、实例化、继承。
类的结构定义基本是相似的,只是抽象类多了一个修饰符,abstract 。
普通类和抽象类中,都可以出现普通方法。
抽象方法,只能出现在抽象类中,普通类中不可以有抽象方法。
接口
抽象方法的集合。
接口暴露开放能力。
public interface Service{
void m();
}
public class Handle implements Service{
public void m(){
//实现
}
}
面试题-普通方法和抽象方法的区别
方法的重载
在同一个类中,方法名一样,方法的参数列表不同,方法的返回值不做要求。
参数列表的不同,表现在参数的数据类型、参数数量、参数的顺序上。
public class C{
// 对比m1和m2,参数个数不同
public void m1(){}
public void m2(int param){}
// 对比m2和m3,参数的数据类型不同
public void m3(String param){}
public void m4(String param,boolean f){}
// 对比 m4 和 m5,参数的顺序不同
public void m5(boolean f, String param){}
}
继承
基因遗传学上,父母辈,会把一些基因遗传给他们的孩子,他们的孩子还会遗传给下一代。
java编程语言上,需要复用代码,采用的实现方式是继承机制。
场景一:类的继承,单继承,多重继承
public class F{}
public class C extends F{}
场景二:接口的继承,多继承
public interface BeanFactoty{}
public interface FactotyBean{}
public interface Context extends BeanFactoty,FactotyBean{}
继承详细说明:
继承指的是子类继承父类的非私有属性和方法,私有属性和方法是不能被继承的。父类和子类之间的关系是is-a关系。
方法的重写
在父类和子类中,方法名、参数列表、返回值必须一样,一个定义在父类中,重载方法出现在子类中。重写方法体。
where :一定是出现父类和子类中,涉及2个类,父类和子类,并且子类的方法体不是继承父类,而是重新实现。并且被重写的方法不能是private修饰。
why :父类的方法不能满足要求,或者子类具有独有的特性。
示例 :
public class P{
public void action(){}
}
public class C1 extends P{
@Override
public void action(){
// 重写方法体
}
}
// C1 继承了 P ,并且重写了action方法
public class C2 extends P{
@Override
public void action(){
super.action();
}
}
public class C3 extends P{
}
// C2 和 C3都继承了 P,但是没有重写 action方法
public class C4 extends P{
super.action();
// self action code
}