ERHAIMOON_学习日志(day13)

包(package)

​ 包是管理类和接口的,还可以解决命名冲突,类和接口需要定义在包中。

​ 包=目录

​ 类=文件

定义包

定义包必须是java源文件的第一行代码

包名必须小写

使用package关键字定义包

package com.erhaimoon.oop

使用包

使用包就是将包中的类导入到使用的地方。

使用import关键字导入包

例如:

import java.util.Arrays;
import java.util.Scanner;
import java.util.*;

系统包

java.lang.*//此包的类默认都导入了,String,System,Math
java.util.*//工具包,Scanner,Random,Arrays
java.io.*//输入输出File,FileInputStream
java.text.*//国际化程序支持包,SimpleDateFormat

static关键字

static的使用

static可以修饰内部类,属性和方法,定义静态块

public static int live=1;//static修饰属性
public static void sayHello(){//static修饰方法

}
static class Student{//static修饰内部类
    String name;
}
static {//静态块

}

static和instances的区别

  • 静态成员和实例成员分配内存的时机
    • 静态成员是在类名首次出现时,最先分配内存的,静态属性分配在方法区中,然后调用静态块,多个静态块按照定义的顺序从上到下调用。
    • 实例成员在实例化时分配内存的,如果没有实例化对象那么实例成员就没有分配内存
  • 静态成员和实力成员分配内存的次数

​ 静态成员只分配一次内存,因此静态成员只有一份

​ 实例成员分配内存的次数由实例化的次数决定,每实例化一次分配一次内存。

  • 静态成员和实例成员的调用规则
    • 静态成员由类名调用,也可以由对象名调用,但是不推荐使用对象名调用
    • 实例成员由对象名调用,不能使用类名调用
    • 静态属于类成员,因此静态成员也称类成员(类变量,类方法)
    • 实例属性是对象成员
  • 静态块的作用
    • 实例属性可以通过构造函数初始化。
    • 静态属性可以通过静态块初始化,因为类名首次出现时先为静态变量分内存然后就调用静态块

java中的常量

值不可以更改的变量称为常量

使用static final修饰的变量是类常量

使用final修饰的变量是实例常量

final是java的关键字,final可以修饰类,属性,方法,修饰类时不能被继承,修饰方法时不能被子类重写,修饰属性时属性不能改值。

public class Books {
    public static final String NAME;//定义常量
    public final int price;//定义实例常量
    public Books(int price){//在构造函数中实例常量初始化
        this.price=price;
    }
    static {
        NAME="ni hao";//在静态块中类常量初始化
    }
}

继承

使用继承的原因

  • 代码复用,减少代码冗余,增强扩展性
  • 继承实质上是为了实现多态

怎么实现继承

使用extends关键字实现继承

子类继承父类后,子类就继承了父类中的成员,导致子类无需重新创建,简化了子类的设计

super与this关键字

super表示父类

this表示子类

super的用法:在子类构造函数中调用父类构造函数

public class Son extends Father {
    private String hobby;
    public Son(String name, int age, String number, String hobby) {
        super(name, age, number);
        this.hobby = hobby;
    }
}

super调用父类构造函数时,必须写在子类构造函数的第一行,通常父类定义的属性由父类负责初始化,子类定义的属性由子类初始化。子类通过super(参数列表)的方式将子类构造函数中的参数传递给父类,让父类初始化。

在子类的方法中调用父类的方法

public String toString(){
    return super.toString()+"hobby="+hobby;
}

继承中属性的初始化问题

建议是定义的属性,由谁初始化

class A{
    int a;
    public A(int a){
        this.a=a;
    }
}
class B extends A{
    int b;
    public B(int a, int b) {
        super(a);
        this.b = b;
    }
}
class C extends B{
    int c;
    public C(int a, int b, int c) {
        super(a, b);
        this.c = c;
    }
}
public class Demo {
    public static void main(String[] args) {
        C c = new C(1, 2, 3);
    }
}

调试程序,观察了过程

​ 当前类的构造函数得到参数中,留下自定义的函数需要的参数,其余的参数通过super传递给父类初始化

继承中的实例化顺序

  • 当实例化一个对象时,该对象的所有父类也都被实例化了
  • 实例化顺序是从父类到子类
  • 继承中构造函数调用顺序是从子子类到父类
  • 继承中构造函数的执行顺序是从父类到子类

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1