一、类与对象
声明类
修饰符 class 类名 {
// 属性
数据类型 变量名;
// 方法
修饰符 返回值类型 方法名 (形参) {
方法体
}
}
类名需要符合命名规则,约定第一个字母大写.
当修饰符为public时,类名必须与文件名保持一致.
创建对象
类名 对象引用名 = new 类名(构造方法的实参);
// 引用中间存放的是对象的首地址,并非存放一个对象
// 执行该语句时完成两步:创建对象;调用类的构造方法
属性的默认值
整型:0
浮点型:0.0
字符型:空字符(ASCII码为0)
布尔型:false
引用型:null
属性和方法的调用
对象名.属性名;
对象名.方法名(实参);
类的构造方法
(1) 构造方法是类中一个特殊的方法:
① 写法特殊:
a. 构造方法没有返回值;
b. 构造方法的名称与本类的名称相同
② 调用特殊:
该方法在"new 类名(构造方法的实参)"创建对象时系统自动执行.
(2) 类有一个默认的不带参数的构造方法,一旦写入了新的构造方法,默认的构造方法会失效(需手动定义),这不是重载.
类方法的重载
在一个类中间,定义多个名称相同但是参数不同的方法.
参数不同指:(1) 数据类型不同 (2) 参数个数不同
静态
(1) 静态属性和静态方法
静态属性和静态方法由static修饰,它们属于类所有,可以直接通过"类名."来调用.
在静态方法中不可以直接调用非静态方法.
不能将方法体内的局部变量声明成static的.
(2) 静态初始化块
为了在执行类时先执行类的初始化动作,使用static定义了一个静态区域.
public class Test {
static {
// 代码块
}
}
静态初始化块只在类初次加载时执行一次,与创建多少个对象无关,并且是在调用构造函数之前执行该初始化块.
注意:静态方法和静态初始化块中间不能使用this关键字和super关键字,它们只与类有关,不属于对象.
对象的销毁
针对由new创建的对象,一旦它们被视为垃圾,Java将通过垃圾回收机制(GC)自动回收.
对象被视为垃圾的情况:对象的首地址丢失,不能被对象引用找到的对象.
在对象被回收时自动调用finalize()方法.
二、类的继承
基本思想:基于某个父类进行扩展,得到新的子类. 子类可以继承父类原有的属性和方法,也可以增加自己独有的属性和方法,或者直接重写父类中的某些方法.
类继承类只能单一继承,即一个子类只能有一个父类.
语法格式:
修饰符 class 子类名 extends 父类名 {
// 子类将父类非私有的属性和方法(不包括构造方法)都复制一份
// 如果属性名相同,子类属性覆盖父类属性
子类新增属性
子类新增方法
子类重写的父类方法
// 方法名、形参与被重写的方法相同,返回值类型为原返回值类型或其子类型,访问修饰符不变或者为作用域更大的访问修饰符
子类重载的父类方法(参数列表必须不同)
}
调用子类构造方法之前,会先执行"父类"(父类以及父类的父类等等)的构造方法.
父类具有的属性和方法子类都有,子类会比父类中的属性和方法多.
Object类
它是Java中所有类的父类,即超级父类,用户创建一个类时,除非指定了继承自其他父类,否则它就是从Object类直接继承而来的.
三、对象类型转换
对象的强制类型转换必须之间有继承关系(或实现关系)
子类对象一定可以转换成父类(或父接口)对象,并且可以不用显示转换
父类 父类对象 = (父类)子类对象; // 显示转换
父类 父类对象 = 子类对象; // 隐式转换
例:
Zi zi = new Zi();
Fu fu = zi; // 把zi存放的首地址复制一份给了fu,没有创建新的对象
父类对象不能使用子类的新增成员.
子类重写了父类方法后,通过父类对象调用该方法,调用的是子类重写后的.
父类对象不可以转换成子类对象
因为父类缺少子类特有的属性和方法,所以不能转换.
除了一种情况:父类引用本来装的就是子类对象的首地址.
例:
Fu fu = new Zi(); // fu只能使用从Fu继承来的属性,调用重写后的方法
Zi zi = (zi)fu; // zi正常使用子类的属性方法
四、抽象类与接口
抽象类(属于类)
语法结构:
public abstract class 类名 {
属性
方法
抽象方法
}
抽象类内部可以没有抽象方法,但内部有抽象方法的一定是抽象类.
接口(目的是定义一个规范)
语法结构:
public interface 接口名 {
公共静态最终属性 // 不写修饰符,默认是公共的、静态的、最终的
公共抽象方法 // 不写修饰符,默认是公共的、抽象的
}
实现接口的关键字:implements
一个类既继承父类又实现接口
修饰符 class 子类 extends 父类 implements 接口,接口,... {
// 重写接口中的所有抽象方法
}
快捷键:Ctrl + 1,然后选择Add unimplemented methods
类、抽象类、接口的区别
(1) 类可以创建对象,接口和抽象类不能创建对象;
(2) 类继承类:单一继承
类继承抽象类:单一继承(必须重写抽象类的所有抽象方法)
类可以实现多个接口(必须重写接口中间所有的抽象方法)
(3) 抽象类可以继承类:单一继承
抽象类可以继承抽象类:单一继承(可以不重写抽象方法)
抽象类可以实现多个接口(可以不重写抽象方法)
(4) 接口可以继承多个接口(注意关键字是extends不是implements)
五、Java类包
同一个包中的类相互访问时,可以不指定包名.
一个类要访问不同包中的类时,要么导包,要么写出完整类路径.
打包:
package 包名1.包名2......;
该语句必须是一个文件中的第一条语句,并且在文件中间只能出现一次.
包的命名规则是全部使用小写字母.
使用import关键字导入包:可以指定类的完整描述;也可以在包指定后加上*,这表示可以在程序中使用包中的所有类.
六、修饰符
访问修饰符
访问级别 | 访问修饰符 | 同类 | 同包 | 子类(不同包) | 不同包(其他类) |
公共 | public | √ | √ | √ | √ |
受保护 | protected | √ | √ | √ | × |
默认 | 缺省(friendly) | √ | √ | × | × |
私有 | private | √ | × | × | × |
类、属性、方法可以使用的修饰符
访问修饰符 | 静态修饰符 | 抽象修饰符 | 最终修饰符 | ||||
public | protected | (friendly) | private | static | abstract | final | |
类 | √ | × | √ | × | × | √ | √ |
属性 | √ | √ | √ | √ | √ | × | √ |
方法 | √ | √ | √ | √ | √ | √ | √ |
通常将属性声明为private,将方法声明为public
通过set方法改变属性值,通过get方法获得属性值
快捷键:Alt + Shift + S,然后选择"Generate Getters and Setters...".
final修饰符:
final class 类名 {} // final修饰的类不能被继承
final 数据类型 变量名 = 值; // 没有默认值,所以必须初始化,并且值不能更改
final 返回值类型 方法名 (形参) {} // final修饰的方法不能被重写
final修饰符和abstract修饰符不能同时使用
abstract修饰符和static修饰符不能同时修饰某个方法,即没有类抽象方法
private和abstract不能同时修饰方法,因为抽象方法必须在子类中被重写
七、this关键字和super关键字
this关键字
用途1:通过this表示类自己本身的对象;
用途2:通过this作为实参调用类自己的构造方法(只能在构造方法的第一句话使用);
用途3:可以this.属性(区别于同名的局部变量),this.方法.
super关键字
用途1:给父类的构造方法传递实参
例:
public XueSheng(int x) {
System.out.println("父类构造方法");
System.out.println(x); // 输出的值为3
}
public ZhongXueSheng() {
super(3); // 必须写在第一句
System.out.println("子类构造方法");
}
用途2:用super调用从父类继承的属性和方法
八、异常处理
抛出异常
方法定义:
返回值类型 方法名(形参) throws 异常种类 {
throw 异常对象;
方法体
}
捕获异常
如果一个方法会抛出异常,那么在调用该方法时,必须捕获异常.
方法调用:
try {
方法名(实参);
} catch(Exceptiontype1 e) {
// 对Exceptiontype1的处理
} catch(Exceptiontype2 e) {
// 对Exceptiontype2的处理
} ...
一条语句产生异常后后面的代码不会执行.
常见异常种类:
IOException:输入输出异常
FileNotFoundException:文件未找到异常
ArrayIndexOutOfBoundsException:数组下标越界异常
ClassNotFoundException:未找到相应类异常
NullPointerException:空指针异常
0条评论
点击登录参与评论