目录
一轮复习书本和ppt的基础学习
数组
字符串
(38条消息) intern()详解_aaaayl的博客-CSDN博客_intern详解
对象的属性和方法
数据域变量可以是Java的任何一种基本数据类型或类。
局部变量与成员变量同名时, 在方法中的局部变量优先。
类的所有构造方法均为private时, 无法在类外部创建对象
二轮复习应该注意的点(在试卷有涉及到的)
break; 跳出包含它的最内层循环, 或跳出包含它的最内层 switch结构。
break 标号; 跳出标号指明的循环。 continue; 结束包含它的最内层循环的当前迭代,程序控制转 到循环体末尾。 continue 标号; 结束标号指明的循环的当前迭代。
continue; 结束包含它的最内层循环的当前迭代,程序控制转 到循环体末尾。
continue 标号; 结束标号指明的循环的当前迭代。
String对象是不可变的, 其内容不能改变.
Java把相同的字符串直接量存储为一个对象(规范字符串).
由于String对象是不可变的,因此对String对象进行修改操作 时,原字符串不变,生成一个新的String对象。
封装性:
通过抽象找出具体实例中的共同特征(数据和操作), 将数据和对数据的操作封装在一起。
继承性:
子类可以继承父类的数据及数据操作, 同时又可以扩展子类独有的数据及数据操作。
多态性:
基于重载实现的静态多态:多个操作具有相同名称, 但是接 收不同的消息类型。
基于继承和覆盖实现的动态多态:同一操作被不同类型的 对象所调用产生不同的行为。
据域变量可以是Java的任何一种基本数据类型或类。
Java中没有独立的方法,方法必须定义在类的内部。
定义在类中, 局部变量与成员变量同名时, 在方法中局部变量优先。
一个类可以有多个构造方法, 通过方法重载实现, 即多个构造方法的形式参数的个数或类型必须不同.
数据域进行初始化, 默认规则:引用型为 null; 数值型为0; boolean型为false; char型为'\u0000'。
Java语言中, 所有参数都是 “值传递”, 即发生方法调用时, 方法 调用语句中的 “实际参数” 把其值 “单向传递” 给 “形式参数”。
Java中的每个类都属于某一个包, 类在编译时被添加到包中. 默认情况下, 类在编译时放在当前目录(默认包).
把类添加到指定包中, 只需在源程序的最前端加上: package packageName;
访问权限:指限制在一段代码中能否访问一个类或能否通过 “.” 访问的类中定义的方法或成员变量。
所以说,访问权限修饰词默认构造方法的访问权限与类的访问权限相同)
- 类:只有public或者无修饰符
- 构造方法:public、private(仅供本类使用)、缺省(同包)、protected
- (普通)方法、成员变量:public、private(仅供本类使用)、缺省(同包)、protected(继承子类的同包或不同包)
- potected与继承有关
用this引用数据域(例this.x):当(本类)数据域与方法局部变量同名(形参)时
this关键字主要有2种使用方式:
- 在类的构造方法中使用, 调用本类的其他构造方法。
语法:this(实参表) 如果使用该语句, 必须在构造方法的第一句
- 在类的构造方法和实例方法中使用,代表对当前对象的引用。
访问实例变量语法:this.实例变量名
访问实例方法语法:this.实例方法名(实参表)
(每个构造方法和实例方法中都隐含有一个this引用)
super关键词在子类中使用,主要有2种用途:
- 调用父类的构造方法
- 访问已经继承的成员变量和实例方法: super.方法名(参数) super.成员变量(无论否被隐藏或重写。)
static修饰是静态成员 (静态成员变量 静态方法)
未用static修饰是实例成员( 实例成员变量 实例方法)
不同对象的实例变量互不相同
- 实例变量只有其对象创建后才会分配内存空间。
- 使用new运算符创建对象时,每个对象的实例变量占用各自不同的内存空间。
所有对象共享静态变量
- 静态变量在类加载到内存时分配内存空间。
- 使用new运算符创建对象时,各个对象的实例变量共享已经存在的静态变量的内存空间。
- 对静态变量的使用方式是:类名.静态变量
- 对实例变量的使用方式是:引用变量.实例变量
如何理解在静态方法中不能访问未创建对象的实例成员?
如在static main主函数中要调用本类的方法
- 该方法是静态方法static(不需要经过实例化、在类加载时已经分配了内存空间)
- 创建该方法的实例化对象,以此用对象(实例化之后才分配入口地址后,进入该地址)访问该实例成员的方法等。
静态成员变量也可以进行封装
初始化器是直接在类中定义的用一对{}括起来的语句组。
- 静态初始化器使用static关键字修饰,用来初始化静态变量。
- 实例初始化器没有修饰关键字,用来初始化实例变量。
- 一个类可以有0个或多个静态和实例初始化器。
静态初始化器的执行:类首次加载到内存时,首先是静态数据 域变量的变量初始化;然后按排列顺序执行类中staic初始化器。
实例初始化器的执行:每次使用“new 构造方法();”创建对象 时,首先是实例数据域变量的变量初始化,然后开始执行本类 的构造方法,但在构造方法第一条语句执行之前,按排列顺序执行类中的实例初始化器,然后执行构造方法中的剩余语句。
java 对象的初始化过程 - 假装懂Java - 博客园 (cnblogs.com)
下图引用于上文:
静态方法可以重写,但不是覆盖
引用类型变量存放其引用的对象的地址
简单了解UML类图(- 表示 private + 表示 public # 表示 protected)
Java只支持单继承, 即一个子类只能继承一个父类.
不写时, 默认父类是: java.lang.Object
子类继承父类的成员变量和方法是指子类可以将它们作为自己 定义的成员, 访问权限保持不变。
子类继承父类有2个方面的含义:
- 继承父类可访问的数据域和方法
子类与父类在同一包中, 继承:public, protected, 默认
子类与父类在不同包中, 继承:public, protected
- 扩展添加新的数据域和新方法
子类构造方法也可以调用本类中重载的其它构造方法(this),此时构造方法的第一句不会是super()或super(参数)
但是要保证任何一个子类构造方法都能够调用父类构造方法。
类成员的中访问权限修饰词的作用域
本类 | 同包的 类 | 不同包 的子类 | 不同包的 非子类 | |
private | YES | |||
缺省 | YES | YES | ||
protected | YES | YES | YES | |
public | YES | YES | YES | YES |
final关键字总结
final类不能被继承. public final class Math { ...... }
final方法不能在子类中被重写(覆盖). public class A{ …… public final void aMethod() { … … } }
final变量的值不能改变, 即常量. final double PI = 3.14159;
ToString方法重写
equals方法重写
hasCode方法重写
instanceof运算符
程序中如何实现多态:
- 多态在类的继承层次结构中实现.
- 表现多态的形式是子类覆盖父类的实例方法.
- 通过父类的引用去访问继承层次中不同类的对象. 调用覆盖的方法时产生多态。
注:如果子类重写父类的静态方法,子类对象的向上转型对象不能调用子类静态方法, 只能调用父类静态方法。 即:多态性只针对实例方法
抽象方法: 只有方法头没有方法体.用abstract修饰.
抽象类: 用abstract修饰的类, 不能用new创建对象.
抽象类与抽象方法的相关说明:
- 包含抽象方法的类必须是抽象的, 但也允许声明没有抽象方法 的抽象类.
- 抽象类不能用new运算符实例化, 但包含构造方法.
- 具体的父类也可以派生抽象的子类.
- 子类可以将父类的具体方法覆盖为抽象方法.(少用)
- 抽象类不能创建对象, 但可以声明对象引用变量. GeometricObject geo;
接口
- 子类需要Override其实现接口的抽象方法,如果没有全部覆盖(实现),则子类需要使用abstract修饰。
- 接口中的抽象方法均为public,因此子类在覆盖接口的抽象 方法时,形式上要求方法头完全相同。
由于接口中的成员都是public的, 因此子接口可以继承父接口中 的所有成员。
如果子接口中定义了与父接口同名的常量或者相同的方法, 则父接口中的常量被隐藏,方法被覆盖。
如果多个父接口中有同名的常量,则子接口不能继承, 但子接口中可以定义一个同名的常量。
如果一个类继承一个父类并实现了一个接口,而从父类和接 口中继承了同名的方法,此时采用“类比接口优先”的原则, 即只继承父类的方法,而忽略来自接口的默认方法。
实现Clone
实现类的clone操作, 需要完成2项工作:
- 类必须实现java.lang.Cloneable接口.
package java.lang;
public interface Cloneable { }
- 类需要覆盖Object类的clone方法.
Object类中的clone方法的定义如下:
protected native Object clone() throws CloneNotSupportedException;
“克隆”的使用示例:
House h1 = new House(1, 137.00);
House h2 = (House)h1.clone(); //注意强制类型转换
说明: 一个类如果实现了Cloneable接口,通常需要重写equals和 hashcode方法.
“深克隆”:即克隆对象中存在引用型变量。
@Override
public Object clone() {
try {
House t = (House) super.clone();
t.whenBuilt = (Date) this.whenBuilt.clone();
return t;
}
catch (CloneNotSupportedException e) {
return null;
}
}
catch子句的排列顺序非常重要, 不能将父类的 catch子句排列在子类catch子句之前.
Java强制要求程序员处理必检异常, 如果一个方法中某些语句可能抛出必检异常, 则:
该方法中处理该必检异常, 即使用try-catch语句.
该方法必须声明抛出该异常, 即方法声明中使用throws关 键字声明该异常.
File
一个类实现了 java.io.Serializable 接口,则该类的对象就是 可序列化对象。
使用 ObjectOutputStream 和 ObjectInputStream 能够对 可序列化对象进行读写操作。 java.io.Serializable 是标记型接口,实现时无需重写方法。
例如: public class Student implements java.io.Serializable { //...... }fanxing
泛型
Java定义类时可以继承一个父类或实现多个接口,父类可以是 泛型类,接口可以是泛型接口。
泛型的注意事项:
匿名类允许同时定义和实例化一个类。
匿名类实际上是一个没有名字的内部类。
匿名类表达式由以下几个部分组成:
new
匿名类需要实现的接口名或需要继承的父类名
圆括号, 其中包含需要传递给(父类)构造方法的参数 如果匿名类实现的是接口, 参数表保持为空。
类的主体, {}包围, 其中可以声明数据域或方法。
函数式接口,一个接口,然后就是在这个接口里 面只能有一个抽象方法
Lambda表达式是在应用函数式接口环境下一种简化定义形式, 可以解决匿名内部类定义形式复杂的缺点。
Lambda表达式可以作为实参传递给方法。方法对应的形参必 须是一个函数式接口类型。
多线程
Thread类:直接继承,重写run()方法;
Runable接口:(先创建一个可实现runable接口的类,通过创建thread类对象,调用该对象的方法,即实现run重写的方法。)
运行实现Runnable接口的线程需要通过Thread类对象,步骤如下:
- 创建实现了 Runnable 接口类的对象
- 创建 Thread 类的对象,将实现Runnable接口类的对象作为构造方法参数
- 使用 Thread 类对象的 start 方法启动线程