1、this关键字
在Java中,this关键字表示当前对象的引用,它可以用于引用当前对象的成员变量、成员方法和构造函数。this关键字的主要作用是消除成员变量与方法参数之间的歧义,或者在构造函数中调用其他构造函数。
this关键字的使用方式如下:
1.在方法中可以通过this关键字表示调用该方法的对象。
通常在类中使用this区分成员变量和参数,如果没有歧义,可以省略this。
2. 调用成员方法:使用this关键字可以在类的方法中调用当前对象的其他成员方法。
this关键字必须在实例方法、构造函数和实例初始化块中使用。在静态方法中无法使用this关键字,因为静态方法无法引用特定的对象。
2、Java继承
2.1 extends关键字
extends关键字可以实现类的继承,子类(sub class) 可以继承父类(super class)的成员变量及成员方法。同时也可以定义自己的成员变量和成员方法。
2.2 类的继承格式
class 父类 {
}
class 子类 extends 父类 {
}
2.3 继承的关键点
-
父类和子类的关系:子类是派生/继承自父类,子类通过关键字
extends
来继承父类。 -
代码重用:继承允许子类复用父类中的代码,子类可以直接访问继承的成员变量和方法,无需重新定义。
-
子类的扩展和修改:子类可以在继承父类的基础上添加新的属性和方法,也可以重写父类的方法来改变其行为。
-
单继承和多层继承:Java中支持单继承,即一个子类只能继承一个父类。但是,可以通过多层继承形成继承的层级结构。
2.4 向上造型
向上造型(Upcasting)是指将一个子类对象赋值给父类类型的引用变量。这种转换发生在继承关系中,其中子类是父类的一个特殊类型。
一个子类的对象可以向上造型为父类的类型
java编译器编译的时候根据父类型检查调用的成员变量和成员方法是否匹配。
2.5 instanceof关键字
// 引用和类的类型的使用
类名.class ,可以获取类型名,引用.getClass()方法 ,可以获取引用指向的对象的类名。对于一个父类的引用类型,可以指向该类的对象也可以指向其任意一个子类型的对象。
通过instanceof 关键字判断引用指向的对象的实际类型。根据引用指向的实际类型,将引用强制转换为实际类型
//instanceof关键字,运算结果为boole,用于判断某个引用指向的对象,是否某种类型
//判断类型是否一致,然后强转,避免抛出异常。
public class TestRect {
public static void main(String[] args) {
Shape s=new Rect();
Rect r=new Rect();
if(s instanceof Rect){
System.out.println("s指向对象是Rect类型");
}
if(r instanceof Rect){
System.out.println("r指向对象是Rect类型");
}
//通过类的类型(类.class)
}
}
2.6 super关键字 & super函数
子类中可以使用super关键字,调用父类的属性和方法
子类的构造方法中必须通过super调用父类的构造方法。因为创建子类之前,必须先创建父类。
子类的构造函数如果没有直接使用super调用父类构造方法,java编译器会自动的加入对父类无参
构造函数的调用(那么要求父类必须有无参构造方法)。
// super: 调用父类的方法 ,属性
public class SuperDemo {
public static void main(String[] args) {
Son son = new Son();
son.sayHi();
}
}
class Father{
int x;
int y;
public void sayHi(){
System.out.println("hello");
}
public Father(){
System.out.println("Father-- 无参");
}
public Father(int x , int y){
this.x = x;
this.y = y;
System.out.println("Father --- 两个参数的");
}
}
class Son extends Father{
int m;
int n;
public Son(){
//super(); // --- super()函数, 表示调用父类的无参构造函数。
super(3,6) ;// --- super(int ,int)函数 ,表示调用父类有两个参数构造函数
}
public Son(int m , int n){ // 给自己的(包含继承来的)成员变量初始化
super(3,3);
this.m = m ;
this.n = n ;
}
public Son(int m ){
// super(3); // 编译错误,父类不存在一个int类型参数的构造函数。
this.m = m;
}
public Son(int m , int n , int x){
this.m = m ;
this.n = n ;
this.x = x ;
}
public void print(){
int k = super.x; // 调用父类的属性
int k1 = super.y;
int k2 = x+y; // super可以省略, 继承了父类的属性,可以直接使用
super.sayHi();
sayHi();// 省略了super。 继承了父类的方法,可以直接使用。
}
public void sayHi(){
// 调用父类的sayHi方法。
super.sayHi();
// 没有用super,指定调用父类方法,优先调用给自己的方法,如果自己没有这个方法,再
调用父类的方法。
// sayHi();
}
}