通过这两个星期的学习,我感觉我的编程能力得到了很大的提升,从一个什么都不会的菜鸡,变成了初步了解Java基础的新手,我觉得这两个星期过得很充实,虽然压力有,但是更多的是享受。
方法的重载(overload)是多态的一种实现策略,方法的重载表现为在一个类中包含多个同名的方法,但是每个方法必须保证方法中的参数列表(类型,个数,顺序)任意一项不一致,方法重载与返回值无关。
方法重写(Override)和重载(Overload)区别:
-
方法重写发生在存在继承关系的子类中,由子类重写父类的方法;方法的重载一般发生在同一个类中
-
方法重写必须保证方法的返回值类型与父类一致;方法的重载与返回值无关
-
方法重写时必须保证方法中的参数列表与父类一致;方法重载必须保证每个方法的参数列表不一致
-
共同点:不论方法重写还是重载,都必须保证方法名一致
在一个java类中如果存在多个构造器,每个构造器中都有重复代码时,可以将重复的初始代码归纳到一个游离块中,统一执行,从而解决构造器中代码重复的问题,游离块一般在构造器执行之前先执行,在构造对象时隐式调用,本质上就是一个方法的执行体。
在java中每一个基本数据类型都有一个与之对应的引用类型,基本类型数据一般用于算数运算,布尔逻辑,关系等运算,但是无法进行对象操作(方法调用,属性调用);但是,通过封装类型可以实现基本类型的对象操作,比如进行字符串与基本类型数据之间的转换,进制转换。
String在java中表示定长字符串,一旦对String初始化,则无法修改内容,除非重新赋值(创建新对象),所以String在进行大量字符串拼接时会频繁创建新对象,从而影响程序的运行效率;
StringBuffer是一个长度可变的字符序列,可以动态在原来字符串缓冲区的基础上追加(append)或者插入(insert)新的字符序列,而不会修改对象的内存地址,所以使用StringBuffer在完成字符串拼接时效率较高,另外StringBuffer是线程安全的实现,所以在线程并发操作时效率会有所影响
StringBuilder跟StringBuilder具备相同的API(构造器,方法等),但是StringBuilder是不执行同步(线程不安全),因此效率会高于StringBuffer.
static可以用于修饰内部类,属性,方法,游离块;被static修饰的元素与实例无关(与对象无关),与类直接相关,一旦类被加载则static修饰的元素都会被初始化,static修饰的元素有最高存活优先级,即便普通引用对象被GC回收时,static修饰相关资源不会立即回收;被static修饰的属性,方法,内部类称之为静态属性,静态方法,静态内部类,这些元素都无需创建对象调用,可以直接通过类名(加".")进行调用,一般static用于常量定义,一些工具类中的方法,需要反复执行,但是不需要反复创建。
-
实例变量,实例方法(需要通过对象进行调用,属于对象的)
-
类变量,类方法(直接与类相关的静态元素)
-
关于static元素的注意事项
-
不允许在静态方法中使用非静态元素(静态方法被调用时可能对象还未创建,非静态元素都需要通过对象调用)
-
静态元素只会在类加载时初始化一次
final可以用于修饰类,方法,属性,被final修饰的元素:
-
final修饰的类不可被继承(断子绝孙类)
-
final修饰的变量不可被改变(常用于与static组合进行常量的声明)
-
final修饰的方法是不允许被重写
在java中,方法和属性都是可以以多态的形式存在的,方法的多态主要体现方法的重写与重载;属性的多态一般表现形式为父类引用指向子类对象(向上转型);一个引用类型变量既可以指向该引用类型自身,也可以指向该类型子对象,该操作称之为多态,或者动态绑定。
多态的优势:
-
降低了类之间的耦合
-
面向抽象编程
-
提高程序的可扩展性
多态中关于对象转型问题:
可以使用父类引用指向子类对象(上转型);反过来子类引用可以指向父类对象(下转型),但是被下转型的父类对象原本就应该是子类的对象,否则会出现:java.lang.ClassCastException异常(造型失败)
interface,是一种比抽象类更纯粹的结构,接口中只能存在抽象方法和常量(接口是一组抽象方法和常量的集合),接口并不是类,所以没有构造器;一般可以由具体类对接口进行实现,并且具体类必须实现接口中的所有方法
接口语法:
<modifier> interface <name>[extends <superinterface>] {
<attribute_declarations>
java中可以在一个类的内部定义属于该类的从属类,从属类具备访问外部类的成员的能力,内部类提供了比方法更完整封装性,内部类主要包含以下几种:
-
成员内部类
-
局部内部类
-
静态内部类
-
匿名内部类
关于内部类注意事项
-
内部类可以使用外部类的成员变量和方法
-
局部内部类如果需要使用外部方法(或者语句块)的局部变量,该局部变量必须使用final修饰(延长局部变量的生命周期)
-
局部内部类的使用范围仅限于声明区域
-
静态内部类中不能直接使用外部类的实例方法实例变量,创建外部类对象,才能通过对象调用
在java中程序的运行往往会因为设计或者编写过程中引起一些错误的操作,这些错误信息主要包含两种类型
-
错误(Error):通常是JVM内部错误,或者资源耗尽等一些无法从本质上解决的问题(严重问题)
-
异常(Exception):因为一些编程错误或者外在因素引起的可以被修复的问题
Error和Exception都是从Throwable类继承过来
java程序在运行时或者编译时如果出现异常,则会产生异常对象,对于该异常对象的处理方法,通常包含两种解决方法:
-
异常抛出(throws)
-
异常捕获(try...catch...fianlly)
java中的异常处理通常包含以下关键字:
-
throw :一定会抛出该异常,通常出现在方法内部用于显式抛出
-
throws :抛出有可能出现的异常,出现在方法声明区域(在参数列表后面)
-
try :try语句块一般用于将有可能出现异常的语句包裹
-
catch:处理try语句块中可能出现的异常,一旦异常产生则进入对应的catch块(可以catch多种异常)
-
finally:finally语句块中内容无论是否出现异常,都会执行,一般用执行资源清理与回收
关于异常处理
-
对于异常抛出,被抛出的异常必须由后续的调用者处理(继续抛出,捕获)
-
存在继承关系的子类中不能抛出超出父类抛出的异常范围
-
如果父类方法没有抛出任何异常,则子类重写父类方法时只能对产生异常捕获
如何快速定位异常出现的位置:
-
观察异常的类型名称
-
观察异常的关键字(异常名之后)
-
第一次出现异常的代码行数
正则表达式类似于操作系统的一些通配符,通过特定的符号组合的表达式对一段文本进行检索,替换,分析等操作,正则表达式最早起源于Perl语言,目前成为业内的一种通用的表达式语言,Java中通常基于以下几个类使用正则表达式:
-
String
-
Pattern(正则表达式编译器)
-
Matcher(匹配器)