Java学习打卡Day20

知识内容

内部类

  1. 成员内部类
    Outer out = new Outer();
    Inner in = out.new Inner();
    (1)在类的内部定义,与实例变量、实例方法同级别的类
    (2)外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象
    (3)当外部类、内部类存在重名属性时,会优先访问内部类属性
    (4)成员内部类不能定义静态成员,因为成员内部类不能脱离外部类而独立存在

  2. 静态内部类
    Outer.Inner inner = new Outer.Inner();
    Outer.Inner.show();
    (1)不依赖外部对象,可直接创建或通过类名访问,可声明静态成员
    (2)只能访问外部类的静态成员(实例成员需实例化外部类对象)

  3. 局部内部类
    (1)定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
    (2)局部内部类访问类当前方法中的局部变量时,因无法保障变量的生命值周期与自身相同,变量必须修饰为final(局部变量会随着方法的结束立即释放内存空间、对象中垃圾回收器进行回收,内存满了再回收,非实时、方法区中含有运行常量池,存储的类的信息需要在类卸载(一切和类的相关信息都没有时)之后释放空间)
    (3)限制类的使用范围(更高级的封装)

  4. 匿名内部类
    (1)没有类名的局部内部类(一切特征都与局部内部类相同)
    (2)必须继承一个父类或者实现一个接口(就能把局部内部类改成匿名内部类)
    (3)定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
    优点:减少代码量
    缺点:可读性比较差

Object类

  1. Object类
    (1)任何类,如没书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
    (2)Object类中所定义的方法,是所有对象都具备的方法
    (3)Object类型可以存储任何对象
    作为参数,可接受任何对象
    作为返回值,可返回任何对象

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

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

  4. toString()方法
    (1)public String toString(){}
    (2)返回该对象的字符串表示(表现形式)
    (3)可根据程序需求该方法

  5. equals()方法
    (1)public boolean equals (Object obj){}
    (2)默认实现为(this == obj), 比较两个对象地址是否相同
    (3)可进行覆盖,比较两个对象的内容是否相同
    (4)方法覆盖执行步骤:
    a. 比较两个引用受否指向同一个对象
    b. 判断obj是否为null
    c. 判断两个引用指向的实际对象类型是否一致
    d. 强制类型转换
    e. 依次比较各个属性值是否相同

    今日练习

    1. 写出下列程序的运行结果:
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

  1. 写出下列程序的运行结果:
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. 写出下列程序的运行结果:
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

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

  2. 为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;
	}
}
  1. 有下面代码
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类补充完整,要求:
(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

你可能感兴趣的:(Java学习打卡Day20)