1.this和super各有几种用法
(1)this有三种:
- this.域变量,this.成员方法,在一些容易混淆的场合,例如成员方法的形参名与域变量名相同,或者成员方法的局部变量与域变量名相同的时候,在方法内借助this来明确表示用的是类的域变量。
- this(参数)——引用重载的构造方法
- this指代当前对象
(2)super的用法: - super能指代父类中的域变量或方法。若子类的域变量名或成员方法名与父类的域变量名或成员方法名相同时,要调用父类的同名方法或使用父类的同名域变量,则可用关键字super来指代,
- super.域变量,super.成员方法(参数)
- super(参数)
2.子类对象实例化的具体过程是什么
1.JVM先找指定的类字节码并加载进内存,并会先加载父类的字节码进内存;
2.在堆内开辟内存空间,分配内存地址;
3.在对象的内存空间中对对象的属性进行默认初始化;
4.调用对应的构造方法初始化;
5.在构造方法中第一行先调用父类的构造方法对父类进行初始化;(如果不显示指定父类构造方法,默认为super());
6.父类初始化完毕后,再对子类属性进行显式初始化;
7.再进行子类构造方法的特定初始化;
8.初始化完毕后,将对象的引(分配的内存地址)用返回。
3.类的域变量和方法中的定义的局部变量在初始化上有何区别
1.Java 中类的成员变量会被自动初始化,但是方法里头的局部变量不会被自动初始化.
4.接口有什么作用,自己定义一个接口,并给出实现类和使用类
java 不支持多继承,如果希望一个类能同时继承两个以上的父类
*可以使用接口(interface)来实现多继承的效果
*接口是一种纯粹的 抽象类,只 包含了抽象方法和常量的定义
*抽象方法必须由其子类来实现implement,才能赋予新的功能
*子类实现接口,使用implement关键字,可以实现多个接口,接口名之间用逗号隔空
*接口与抽象类的区别:
*1.接口是纯粹的抽象类,接口中所有 的方法都是抽象的(只有声明,没有定义),而抽象类允许包含有定义的方法
*2.子类实现 接口用implement, 继承 抽象类用extends关键字
*3.子类可以 实现 多个接口,但只能继承一个抽象类
*4.一个子类如果实现了一个接口,就必须重写这个接口里所有的方法;
- 抽象类的子类可以不重写抽象父类里的所有方法,但这个子类会自然成为抽象类
package interfacedemo;
/**
定义一个接口,并定义相应的类来实现实现接口中的方法
*/
public interface Circle {//定义接口
double PI = 3.1415;// 定义常量
void setRadius(double radius);// 定义抽象方法
double area();// 定义抽象方法
}
package interfacedemo;
public class CircleImpl implements Circle {
double radius;// 定义成员变量
public void setRadius(double radius) {// 实现接口的setRadius方法
this.radius = radius;
}
public double area() {// 实现接口中的方法
return (radius * radius * PI);
}
}
public class CircleTest {
public static void main(String[] args) {
CircleImpl ci = new CircleImpl();// 创建类对象
ci.setRadius(2);// 设置半径
System.out.println("圆的面积:" + ci.area());
}
}
5.引用比较方法有哪些
(1)equals方法比较:
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z)
应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals
比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和
y引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
(2)使用“==”进行比较
(3)使用instanceof比较引用类型:
instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是返回true,否则返回false。
也就是说:
使用instanceof关键字做判断时, instanceof 操作符的左右操作数必须有继承或实现关系
6.内部类的作用是什么,什么情况下使用匿名内部类
1.匿名内部类是为了简化书写而产生的 它避免了只是用对象一次却建立了这个对象的繁琐过程
2.使用匿名内部类的前提是该内部类必须是一个类或接口的的子类
3.如使用超类object作为匿名类的父类 则不可以使用父类引用指向子类对象 因为该超类object是没有子类方法的
如何使用匿名内部类呢?
我们可以通过 new 父类对象(){
腹泻父类的方法来使用};
注意大括号后面一定要有分号用来结束 因为整个过程其实是在创建匿名内部类对象 创建对象需要语句 需要分号来结束
7.什么是数据隐藏,如何证明子类对父类同名方法进行重新定义,只能是方法的覆盖,而不是方法的隐藏,
1.在子类对父类的继承中,如果子类的成员变量和父类的成员变量同名,此时称为子类隐藏(override)了父类的成员变量。
2.覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。
隐藏:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。