Java基础–数组和面向对象(Ⅰ)
Java基础–面向对象(Ⅱ)
Java基础–面向对象(Ⅲ)
Java基础–面向对象(Ⅳ)
Java基础–面向对象(Ⅴ)
活动地址:CSDN21天学习挑战赛
一.面向对象
1.局部内部类的特点:
- 不管是局部内部类/成员内部类: 里面的成员都可以直接访问外部类的成员包括私有
- 如何直接通过外部类访问局部内部类
-
在局部位置上,创建了局部内部类的对象,对象名调用成员方法
-
2.匿名内部类:就是没有名字的类
-
匿名内部类只是内部类的一种简化格式;
- 格式
- 抽象类或者接口的匿名内部类
- new 类名或者是接口名(){ //类:一般都是抽象类 ,具体类也可也,但是不推荐
- 抽象类或者接口的匿名内部类
- 格式
-
场景范围:
- 就是在方法的形式参数以及返回值是抽象类或者接口的情况下 ----> 是一种简化格式
-
匿名内部类的本质:
- 就是继承该类(抽象类)或者实现了给接口的子类对象
补充:
//外部类 class Outer { private int x = 100; //外部类的成员方法 public void show() { int num = 20; //隐藏了final修饰符 //局部内部类 class Inner{ //成员方法 public void method() { System.out.println(x);//局部内部类的成员在访问外部类的成员 System.out.println(num); //此时这里面需要访问的外部类的局部变量num } } //创建局部内部类对象 Inner inner = new Inner(); inner.method(); } } //测试类 public class InnerClassDemo { public static void main(String[] args) { //就创建外部类的对象 Outer outer = new Outer() ; outer.show(); } }
jdk版本7的版本,局部内部类访问的外部类的成员方法的局部变量,这个局部变量有什么特点?为什么?
特点:
jdk7的版以及以前:int num = 20 ; 立即报错:必须被final修饰!
jdk8已经优化了,通过反编译查看, num已经被final修饰符
为什么: * 因为局部变量的生命周期,随着方法的调用而存在,并随着方法调用结束而消失,下面这个代码show(),调用完毕,num应该就被是释放了 * 但是,show方法里面创建的局部内部类对象,对象里面的成员方法在间接的使用局部变量,此时不能让num立即释放,所以必须为final修饰符 ----> 最终的,无法更改的,是一个常量!
二.常用类
1.Object
-
Object: 所有Java类的父类(自定义的类或者jdk提供的类),也称为"超类"
-
任何类默认继承自Object
-
常用的功能:
- public String toString(): 本身的含义 :返回对象的字符串表示形式(直接输出对象的名称,就是地址值)
- 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法
- idea工具自动生产
- alt+fn(看电脑,有的需要有的不需要)+ins---->toString()—>ok
- public String toString(): 本身的含义 :返回对象的字符串表示形式(直接输出对象的名称,就是地址值)
-
//测试类
public class ObjectDemo {
public static void main(String[] args) {
//创建一个学生
Student s = new Student("天天",23,"女") ;
//直接对象名称,直接默认访问的就是Object类的toString()---->打印出来的地址值
System.out.println(s) ;//com.qf.object_03.Student@1540e19d 直接输出对象名:地址值 没有意义
//重写Object的toString()---->显示让人容易读懂的信息表达式 ---这个事物的具体信息
System.out.println(s.toString());
}
}
//学生类
public class Student extends Object{ //默认继承Object 隐藏了extends Object:
//不用再去写上去 ----> public class Student 就可以
private String name ;//姓名
private int age ;//年龄
private String gender ;//性别
//无参构造
public Student() {
}
//有参构造
public Student(String name, int age,String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//idea自动生成 ----> alt+fn+ins---->属性全选---->ok
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
2. Object类的常用功能:
- 常用的功能:
- public String toString():
- 本身的含义: 返回对象的字符串表示形式(直接输出对象的名称,就是地址值)
- 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法
- 本身的含义: 返回对象的字符串表示形式(直接输出对象的名称,就是地址值)
- public final Class getClass():
- 使用对象名调用getClass(): 获取正在运行的类或者接口(字节码文件对象),也称为"Class类对象"
- public int hashCode() :
- (了解:哈希算法—提供哈希表) 返回对象的哈希码值 (理解为 “地址值”,不是实际意义的地址值)
- 每一个对象的哈希码值不同的
3.Object类的equals
-
public boolean equals(Object obj):
-
比较两个对象是否相同
-
==和equals区别:
-
==:
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
-
equals(): Object类的方法
-
本身默认比较的是两个对象的地址值是否相同;当多个对象的成员信息相同时,则认为是同一个人,所以Object类需要建议所有的子类要重写equals(),其比较的是对象的成员信息是否相同
补充:
- idea中: alt+fn+ins ----> eauals and hachcode() ----> ok
- 几乎jdk中的所有类都基本重写equals()方法,所以比较的是这些类的成员内容是否相同
-
-
-