第二讲:数据类型、面向对象

49 阅读12分钟

第二讲:数据类型、面向对象

导读

学习任何一门计算机编程语言,首先要了解的内容便是它的数据类型。

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 。

image.png

字节

8个bite就是一个字节,byte 。

image.png

1Byte = 8bit
1KB = 1024Byte
1MB = 1024KB  
1G = 1024MB
1T = 1024G

正数、负数如何表示

思考: 如何区分正数和负数呢?

是不是要有一个标识啊,就像书写的时候 1 和 -1 ,负号就是表示,正号只是发表书写省略了。

左面第一位当做符号位使用,0 表示正数 ,1 表示负数。这样是不是就能表示出正数和负数了。所以使用二进制来表示数值,有2种,有符号和无符号,有符号可以表示正数也可以表示负数,而无符号默认是表示正数(如果强制约定它表示负数也是没有问题的,记住一个词,“约定”)

image.png

取值范围

无符号场景:

有几个比特位置,比如有4个比特,如下 :

image.png 它的取值范围就是 0000 ~ 1111 。

有符号场景:

同理,只不过最高为是符号位置。

image.png

它的取值范围 1111(它是一个负数) ~ 0111(它是一个正数) 。

进制以及进制间的转换

二进制

十进制

八进制

十六进制

十进制和二进制的转换

ps : 自行去拓展,网上一抓一大把 。

基本数据类型的取值范围

image.png

引用数据类型

引用数据类型,除了基本数据类型外,都是引用数据类型。具体包括类、接口、数组。引用数据类型是建立在基本数据类型之上的,由用户(程序员)自己定义,来限制基本数据类型。

// 类 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关键字列表.png

数据类型的使用

数据类型的使用,是用在变量定义的地方,以及类、接口、数组的定义。

变量的声明定义,必须有数据类型约束,这是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 =10Lpublic 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方法是一个重载方法。具体方法签名如下:

image.png

字符串和日期

面向对象

切入

image.png

思考,如何描述上图中的人物信息。

思考维度: 比如肤色、性别、姓名、身高等。

人物介绍
姓名娜美
性别
身高170cm
体重58KG
职业航海士
婚姻未婚
年龄未知

再来描述下图中人物信息:

image.png

姓名: 工藤有希子 性别:女

人物介绍
姓名工藤有希子
性别
身高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 关系。

类,进行实例化得到的结果就是对象。通过类得到对象的过程叫实例化。

image.png

类的具体说明

普通类

普通类可以实例化。

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
        }