知识内容
内部类
-
成员内部类
Outer out = new Outer();
Inner in = out.new Inner();
(1)在类的内部定义,与实例变量、实例方法同级别的类
(2)外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
(3)当外部类、内部类存在重名属性时,会优先访问内部类属性
(4)成员内部类不能定义静态成员,因为成员内部类不能脱离外部类而独立存在 -
静态内部类
Outer.Inner inner = new Outer.Inner();
Outer.Inner.show();
(1)不依赖外部对象,可直接创建或通过类名访问,可声明静态成员
(2)只能访问外部类的静态成员(实例成员需实例化外部类对象) -
局部内部类
(1)定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
(2)局部内部类访问类当前方法中的局部变量时,因无法保障变量的生命值周期与自身相同,变量必须修饰为final(局部变量会随着方法的结束立即释放内存空间、对象中垃圾回收器进行回收,内存满了再回收,非实时、方法区中含有运行常量池,存储的类的信息需要在类卸载(一切和类的相关信息都没有时)之后释放空间)
(3)限制类的使用范围(更高级的封装) -
匿名内部类
(1)没有类名的局部内部类(一切特征都与局部内部类相同)
(2)必须继承一个父类或者实现一个接口(就能把局部内部类改成匿名内部类)
(3)定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
优点:减少代码量
缺点:可读性比较差
Object类
-
Object类
(1)任何类,如没书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
(2)Object类中所定义的方法,是所有对象都具备的方法
(3)Object类型可以存储任何对象
作为参数,可接受任何对象
作为返回值,可返回任何对象 -
getClass()方法
(1)public final Class<?> getClass(){}
(2)返回引用中存储的实际对象类型
(3)应用:通常用于判断两个引用中实际存储对象类型是否一致 -
hashCode()方法
(1)public int hashCode(){}
(2)返回该对象的十进制的哈希码值
(3)哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值
(4)哈希码并不唯一,可保证相同对象返回相同的哈希值,尽量保证不同对象返回不同哈希码。 -
toString()方法
(1)public String toString(){}
(2)返回该对象的字符串表示(表现形式)
(3)可根据程序需求该方法 -
equals()方法
(1)public boolean equals (Object obj){}
(2)默认实现为(this == obj), 比较两个对象地址是否相同
(3)可进行覆盖,比较两个对象的内容是否相同
(4)方法覆盖执行步骤:
a. 比较两个引用受否指向同一个对象
b. 判断obj是否为null
c. 判断两个引用指向的实际对象类型是否一致
d. 强制类型转换
e. 依次比较各个属性值是否相同今日练习
- 写出下列程序的运行结果:
class Student{
private int age;
private String name;
public Student(){}
public Student(String name , int age){
this.name = name;
this.age = age;
}
public String toString(){
return name + " " + age;
}
}
public class TestStudent {
public static void main(String[] args) {
Student stu1 = new Student();
Student stu2 = new Student("Tom" , 18);
System.out.println(stu1);
System.out.println(stu2);
}
}
答:
null 0
Tom 18
- 写出下列程序的运行结果:
public class TestEquals {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);
}
}
答:
true
false
- 写出下列程序的运行结果:
class Animal{}
class Dog extends Animal{}
public class TestGetClass {
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Animal();
System.out.println(a1 instanceof Animal);
System.out.println(a1.getClass() == a2.getClass());
}
}
答:
true
false
-
Java中的内部类包括
A.成员内部类
B.静态内部类
C.局部内部类
D.匿名内部类
E.公开内部类
F.抽象内部类
答:ABCD -
为Worker类增加equals 和 toString 方法。
答:
public class TestWorker {
public static void main(String[] args) {
Worker w1=new Worker("tom", 54 , "male", 99999);
Worker w2=new Worker("annie", 54 , "male", 99999);
System.out.println(w1);
System.out.println( w1.equals(w2) );
}
}
class Worker{
String name;
int age;
String sex;
double salary;
public Worker() {}
public Worker(String name, int age,String sex,double salary) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
public String toString() {
return name + "\t" + age + "\t" + sex + "\t" + salary;
}
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(this.getClass()!=this.getClass()) {
return false;
}
Worker worker = (Worker)obj;
if(this.name.equals(worker.name)&&this.age == worker.age && this.sex.equals(worker.sex) && this.salary == worker.salary) {
return true;
}
return false;
}
}
- 有下面代码
class OuterClass{
private int value1 = 100;
private static int value2 = 200;
public void method(int value3){
final int value4 = 400;
class InnerClass{
public void print(){
//1
}
}
}
}
问:下面哪些代码放在//1处能够编译通过?
A.System.out.println(value1);
B.System.out.println(value2);
C.System.out.println(value3);
D.System.out.println(value4);
答:ABCD
- 已知接口Light定义如下:
interface Light{
void shine();
}
//定义Lamp类:
class Lamp{
public void on(Light light){
light.shine();
}
}
//写一个类TestLamp,部分代码如下:
public class TestLamp {
public static void main(String[] args) {
Lamp lamp = new Lamp();
// 1
// 2
}
}
把TestLamp类补充完整,要求:
(1)在//1处使用局部内部类技术,调用lamp的on方法要求输出“shine in red”
(2)在//2处使用匿名内部类技术,调用lamp的on方法要求输出“shine in yellow”
答:
1处:
class RedLight extends Lamp implements Light{
public void shine() {
System.out.println("shine in red");
}
}
Light light = new RedLight();
lamp.on(light);
2处:
Light light = new Light(){
public void shine() {
System.out.println("shine in yellow");
}
};
lamp.on(light);
打卡
一切都会过去
Done