#在千锋“逆战”学习第20天#周总结、Question 9、内部类

周总结
第四周一晃就过去了,头一次在学习接口回调的时候一头雾水,当时因为听不懂会滋生一些焦急的情绪。不过现在发现学习中上心归伤心,心态还是要放松。当时听不懂的地方,后续肯定还会有用到的时候,总有一天会恍然大明白,老老实实继续多敲两遍代码吧。

内部类
内部类概念:在一个类内部再定义一个完整的类
特点:
编译后可生成一个独立的字节码文件
内部类可直接访问外部类私有成员而不破坏封装
可为外部类提供必要的内部功能组件

内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类
在类的内部定义,与实例变量、实例方法同级别的类

外部类的一个实例部分,在创建内部类对象时,必须依赖外部类对象,ex:
Outer out = new Outer();
Inner in = out.new Inner();

当外部类,内部类存在重名属性时,会优先访问内部类属性。

成员内部类不能定义静态成员。(静态成员可不创建对象直接调用,但是创建内部类对象时必须依赖外部类对象,有可能还没创建外部类对象就调用了静态成员,所以不能定义静态成员)

静态内部类
不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员

只能直接访问外部静态类成员(实例成员需要实例化外部对象)
Outer.Inner inner= new Outer.Inner();
Outer.Inner.show();
静态内部类想访问外部类非静态成员的时候需要用 对象名.属性/方法 的方式来获取,需要先new一个外部类对象

局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法

局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final

限制类的使用范围

匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相似)

必须继承一个父类或实现一个接口

定义类、实现类、创建对象语法合并,只能创建一个该类的对象

优点:减少代码量
缺点:可读性较差

Object类
超类、基类,所有类的直接或间接父类,位于继承树的最顶层
任何类,没有书写extends显示继承某个类,都默认继承Object类,否则为间接继承
Object中所定义的方法,是所有对象都具备的方法
Object类型可存储任何类型对象
作为参数可接受任何对象
作为返回值可返回任何对象

getClass()方法
public final Class<?>getClass(){}
返回引用中存储的实际对象类型
应用:通常用于判断两个引用中实际存储的对象类型是否一致

hashCode()方法
public int hashCode()
返回该对象的十六进制的哈希码值
哈希算法根据对象的地址或字符串或数字计算出来的int类型的值
哈希码并不唯一,可保证相同对象返回相同哈希码值,尽量保证不同对象返回不同哈希码值。

toString()方法
public String toString();
返回该对象的字符串表示(表现形式)
可以根据程序需求覆盖该方法 如:展示对象各个属性值

equals()方法
public boolean equals(Object obj){}
默认实现为(this==obj),比较两个对象地址是否相同
可进行覆盖,比较两个对象内容是否相同。

--------------------------------------------------------------------------我是作业分割线
2. (toString 方法)写出下列代码的运行结果

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
Student类里面覆盖了toString方法,返回Student类的name和age,但是stu1没有传入name和age,返回String和int类型的空值。

  1. (equals)写出下面程序运行的结果
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
第一个比较的是内容,第二个比较的是地址。

  1. (getClass)写出下面程序运行的结果
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
Dog类继承了Animal类,所以第一个返回true。第二个他俩实际的对象是不同的,a1是Animal类的u第项,a2是Dog类的对象。

  1. (内部类)Java 中的内部类包括
    A. 成员内部类
    B. 静态内部类
    C. 局部内部类
    D. 匿名内部类
    E. 公开内部类
    F. 抽象内部类

答案:ABCD

  1. 为 Worker 类增加 equals 和 toString 方法。

在这里插入图片描述
9. (局部内部类)*有下面代码

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

  1. 已知接口 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 类补充完整,要求:
I. 在//1 处使用局部内部类技术,调用 lamp 的 on 方法要求输出”shine in red”
II. 在//2 处使用匿名内部类技术,调用 lamp 的 on 方法要求输出”shine in yellow”

在这里插入图片描述

发布了8 篇原创文章 · 获赞 1 · 访问量 459

猜你喜欢

转载自blog.csdn.net/llpiong/article/details/104561035