Java核心技术 卷(一) 学习记录

(一) 基本程序设计结构

数据类型:

整形分为int long short byte

        java中不含有任何无符号类型(unsigned)

        java中不区分变量的声明和定义

        常量使用final修饰,习惯上常量名使用大写字母


数学函数与常量:

主要借助 Math 类

        Math类中常用方法包含 Math.sqrt() Math.pow() Math.PI Math.E


字符串:

String类型是不可变字符串 可以通过substring()方法进行字符串拼接
        equals 方法可以检测两个字符串是否相等
        equalsIgnoreCase() 方法可以不区分大小写进行字符串相等比较
        注意:java中没有重载"=="进行相等比较的操作
空串和Null串 
        可以调用length()方法,或者将字符串和空字符串进行比较的equals(" ")方法进行判断
        null串则是直接进行"=="对比判断
码点和代码单元
        charAt()方法可以直接返回该码点的代码单元
StringBuilder 类提供更方便的增添功能 (字符串构建器)
        toString()方法返回字符串  append()方法实现增添


输入输出:

Scanner类实现标准输入
        Scanner sc = new Scanner(System.in);该类包含在java.util包中,当一个类不包含在java.lang包中的时候需要将其包含进来

        为了避免内存的浪费输入完了以后可以及时关闭输入,使用Scanner.close()方法进行关闭。
        为了克服Scanner的可见性缺点Java有引入Console类专门用来读取密码
基本类型转换符:
        d,x,o,f,e,g,a,s,c,b,h  java中有System.out.printf()方法
文件的输入与输出
        使用file对象构造一个Scanner对象


循环:

java中提供了带有标签的break & continue:
        break flag;continue flag;

java中的通用型for循环(for each循环)

        for(variable : collection) statement

例如:

for(int element : a)
    System.out,println(element);

大数值:

        如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有 用的类:BigInteger和BigDecimal,分别实现任意精度的整数运算和浮点数运算。


数组:

要想获得数组中元素的个数可以调用array.length方法

数组处理:

        可以使用Arrays类中的sort方法  java.util.Arrays

        Arrays类中包含有二分搜索算法 static int binarySearch(type[] a,type v);

        equals方法比较数组是否相等同样包含在Arrays类中

        打印数组Arrays.toString()方法

多维数组:

        若要使用foeach循环遍历二维数组则需:

for(double[] row : a)
    for(double value : row)
        {
            do something with value;
        }

        java中的多维数组不同于c/c++ 它是一种不规则数组,更可以被称作为“数组的数组”

        同一维数组,若想快速的打印出数组的数据元素列表,可以调用Arrays.deepToString()方法;


 

(二)对象与类

引用:

        java中的引用不同于c++,且所有的Java对象储存在堆中

        例如:

Date birthday;//Java

实际上等同于

Date *birthday;//C++

Date birthday 仅声明了对象变量,一个对象变量并没有实际上包含一个对象,要进行引用对象,对其进行存储地址的分配。

也就是:Date birthday = new Date();

 Java类库中的LocalDate类,可进行查阅学习

main方法:

        每一个类可以包含一个main方法,这是一个常用于对类进行单元测试的技巧

例如:

class Employee
{
    public Employee(String n,double s,int year,int month,int days)
    {
        name = n;
        salary = s;
        LocalDate hireDay = LocalDate.now(year,month,day);
    }
...
public static void main(String[] args)//unit Test
{
    Employee e = new Employee("Romeo",50000,2003,3,31);
    e.raiseSalary(10);
    System.....
}
//如果想要独立的测试Employee类只需要执行 java Emloyee

方法参数:

        一个方法可以修改传递引用所对应的变量值,但不能修改传递至调用所对应的变量值。

java程序对对象采用的不是引用调用,实际上对象引用是值传递的。

包(package):

        Java中使用包将类组织起来,更方便于使用者组织自己的代码,并将自己的代码和别人提供的分开管理。


(三)继承

基础语法:

        继承符号:extends ; 超类 extends 子类

方法覆盖:      

方法重载:Overload
作用:

        解决了同一个类中,相同的功能方法名不同的问题,相同的功能,相同的方法名。

规则:(两同一不同)
        同类中,方法名相同,方法参数列表不同(参数类型、参数个数、参数顺序)


方法覆盖:Override
作用:

        当子类拓展了父类,可以获得父类的部分方法和成员变量。可是当父类的某个方法不适合子类本身的特征时,此时子类需要重新定义父类的方法,并重写方法体,这就叫方法覆盖。

原则:
        覆盖方法必须和父类中被覆盖方法具有相同的方法名称、输入参数和返回值类型。
        覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。
        覆盖方法不能比父类中被覆盖方法抛出更多的异常​​​​​

若想调用父类方法则可使用 super 关键字

子类构造器:

public Manger(String name,double salary,int year,int day)
{
    super(name,salary,year,day)
    bonus = 0
}

这里的super() 便是调用父类构造器的简略形式;this()类似而言也可以调用本类的构造器。

由于父类属性一般是私有域,所以一般需要使用父类的构造器对其属性进行初始化,可以使用super 实现对父类构造器的调用,使用super调用的语句必须是子类构造器的第一条语句

如果子类的构造器没有显式的调用父类的构造器,则将自动的调用超类默认构造,若超类没有不带参数的构造器,编译器将会报错。

继承层次:

继承并不限于一个层次。由一个类派生出来的所有的类的集合被称为继承层次。由某个特定的类到其祖先的路径被称为继承链

注:Java中不支持多继承。

 方法调用:

        弄清楚如何在对象上应用方法调用非常重要。比如下面假设要调用x.f(args),隐式参数x声明为类C的一个对象。下面是调用过程的相信信息。

        编译器查看对象的声明类型和方法名。假设调用x.f(args),且隐式参数x声明为C类的对象。要注意的是,可能有多个名字为f的方法,但是它们的参数类型和返回名称不同。比如:f(int)和f(String)。编译器将会一一列举所有C类中名为f的方法和其超类中访问属性为public且名为f的方法(超类私有方法不可以访问)


        接下来,编译器查看调用方法时提供的参数类型。如果有方法f完全匹配,就是用该方法,这个过程被称为重载解析,不过允许参数类型转换,比如int可以转换为double等等。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就报错。


        如果是private、static或final方法,编译器可以准确地知道调用哪个方法,我们将这种方法调用称为静态绑定(static banding)。与之相对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。


        当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与x引用对象实际类型最合适的那个类的方法,如果当前类中没有,还会在其父类中进行寻找。


        因为每次调用方法都需要进行搜索,时间开销比较大。因此虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。虚拟机当在调用方法的时候仅查找这个表就够了。

阻止继承:final 类和方法 

        当你希望阻止人们利用某个类定义子类时就可以定义为final类(不允许扩展类),例如Executive类为final类

public final class Executive extends Manger
{
    ...
}

类中的方法也可以声明为final,这样子类就不能覆盖这个方法;

强制类型转换:

         type x = (type b) nx;

有时候也需要将某个类的对象引用转换成另外一个类的对象引用。

但需要注意:

        1)只能在继承层次内进行类型转换

        2)在将超类转换成子类之前,应该使用instanceof进行检查

        3)将一个超类的引用赋值给子类变量,必须进行类型转换

//试图从继承链上进行向下的类型转换,并且假报有关对象包含的内容则会报错;
//staff[1]是超类的引用Employee
Manger boss = (Manger) staff[1];//Error

if(staff[1] instanceof Manger)
{
    boss = (Manger) staff[1];
    ...
}//先进行判断防止程序异常终止

instanceof :  判断一个对象是否为指定类的实例左值为引用类型,右值为class

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值