(九)面向对象(补)

面向对象(四)

this关键字

this关键字表示当前对象本身,一般用于类的内部,其内部存在一个地址,指向当前初始化的对象本身.

new 一个对象时,其实产生了两个引用,两个引用执行同一内存空间(对象) 所以类中用this来表示当前对象,因为不用this,我们是不知道在创建对象时具体的对象名的

用法

1.调用成员变量

用于解决成员变量与局部变量之间二义性

2.调用其他实例方法

同一类中非static方法互调

3.调用本类其他构造方法

可以调用本类的其他构造方法,但是必须写在第一句

public Person(String name, String gender) {
        this.name = name;
        this.age = 18;
        this.gender =gender;
    }

public Person(String name,int age ,String gender){
        //this调用构造方法,要放在有效代码第一行
        this(name,gender);
        this.gender=gender;

super关键字

super表示父类 ,当子类需要访问父类成员时,可以使用super
super只是一个关键字 ,内部没有引用,不包含地址

用法

1.super访问父类非私有字段

2.super访问父类非私有方法

3.super访问父类构造方法

  • super 调用构造方法必须写在子类构造方法的第一句
  • 如果子类构造方法没有显示调用父类构造方法的话,JVM会默认调用父类的无参构造super()

static修饰符

static关键字表示静态,修饰变量称为静态变量,修饰方法构成静态方法.

  • 静态变量:使用static修饰的变量,归类所有,也被称为类变量.类的所有实例/对象都可以访问,被类的所有实例或对象共享
语法:
static 数据类型 成员变量 [=初始值];

静态变量的访问
1.类名.静态变量名(推荐方法)
2.实例.静态变量名    
  • 静态方法:static修饰的方法,归类所有,也称类方法
[修饰符] static 返回值类型 方法名(形参){
    
}

静态方法的访问
1.类名.静态方法() (推荐方法)
2.对象.静态方法()    

静态方法的特性

  1. 静态方法中可以访问静态变量和类的其他静态方法
  2. 实例方法中可以访问静态成员(静态变量和静态方法),静态方法不能访问实例成员

jvm加载static成员过程

1.当加载一个类时,会进行到静态区/方法区 ,jvm扫描类名.class字节码文件中的 静态成员并分配空间初始化
    
2.jvm加载完class
    2.1.读取字节码,读取字段,计算字段未来需要申请的空间
    2.2.读取字节码,读取方法,标记方法签名
    2.3.读取字节码,判断是否有静态变量,,立即分配内存空间
    
3.由于static成员是先加载的,所有静态方法不能访问实例成员,原因很简单,因为静态方法先加载,这时候实例方法还没没创建,所有也就无法访问了,返回来,对象的实例方法是可以访问静态成员的 
    

final修饰符

  • final修饰的类:表示最终的类, 该类不能再有子类
  • final修饰的方法:最终的方法, 该方法不能被子类覆盖
  • final修饰的变量:表示常量,该变量只能赋值一次,不能再重新赋值
  • 基本数据类型:表示的值不能改变
  • 引用数据类型:所引用的地址值不能改变

代码块

{} 标记的代码称为代码块

普通代码块

普通代码块{},一般存在于方法中,形成作用域

作用域:

作用域可以进行嵌套,内层作用域可以访问外层作用域,反之则不能

构造代码块

构造代码块在类中(类的内部,方法外),构造代码块,每new一个对象都会执行一次,在构造方法前执行

静态代码块

被static修饰的代码块

静态代码块位于类的内部、方法的外部。 静态代码块只执行一次,在构造代码块、构造方法前执行

内部类

  • 类与类存在平行关系

一个文件可以定义多个类,但是只能存在一个public类,有多少个类,就存在多少份字节码

public class Person{
    
}
class Student{
    
}
  • 类与类存在包含关系
public class Outer {
    public class Inner{
  }
}

Outer和Inner是包含关系。Outer称为外部类,Inner称为内部类。

内部类Inner作为一个Outer的成员而存在。

成员(实例)内部类

内部类Inner作为外部类的一个成员而存在,Inner称为成员内部类。没有使用static修饰的内部类,访问内部类使用外部类的对象来访问

一般成员内部类的访问修饰符都是默认访问权限(包访问权限)
    //定义内部类
    public class Outer {
        [修饰符] class Inner{
    }
  }

//创建对象
public static void main(String[] args) {
Outer outer = new Outer(); // 创建外部类对象
Outer.Inner inner = outer.new Inner();// 创建内部类对象
inner.showInfo(); //调用内部类的方法
}

  • 成员内部类特性

成员内部类可以直接访问 外部类的 私有成员

静态内部类

成员内部类被static修饰,变成了静态内部类,作为外部类的一个静态成员存在

public class Outer {
   static class Inner{
  }
}
  • 静态内部类特性

静态内部类可以访问 外部类的 静态私有成员

方法(局部)内部类

方法内部类只能存在于方法中,也只能在方法中创建对象

方法内部类特性

方法内部类可以读取 方法的局部变量,但不能修改。

匿名内部类

当一个类只使用一次,可以声明匿名内部类

但是匿名内部类必须要有 实现 存在

public class Test01 {
    public static void main(String[] args) {
        Animal animal = new Animal(){
            @Override
            public void showInfo() {
                System.out.println("我是子类匿名内部类");
            }
        };
        animal.showInfo();
new IUsb(){
            @Override
            public void showInfo() {
                System.out.println("我是匿名内部类");
            }
        }.showInfo();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值