2020.12.8

2020.12.8

1.包

包是管理类和接口的,还可以解决命名冲突,类和接口需要定义在包中。(包=目录,类=文件)

1.1定义包

定义包必须是java源文件的第一行代码,包名必须小写,使用package关键字定义包,例如:

package chapter.eight;

1.2使用包

使用包就是将包中的类导入到使用的地方,用import关键字导入包。例如:

import java.util.Arrays;

import java.util.Scanner;

import java.util.*;

1.3系统包

java.lang.*(此包的类默认都导入了)例如:String,System,Math

java.util.* (工具包)例如:Scanner,Random,Arrays

java.io.*(输入输出)例如:File,FileInputStream

java.text.*(国际化程序支持包)例如:SimpleDateFormat

2.static关键字

2.1static的使用

static可以修饰内部类,属性和方法;定义静态块。例如:

public class Person{

public static int live=1;//static修饰属性

public static void sayHello(){//static修饰方法

static class Student{//static修饰内部类

String name;

static{//静态块1

static{//静态块2

2.2static和instances的区别

解析:

(1)静态成员和实例成员分配内存的时机

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

(2)静态成员和实例成员分配内存的次数

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

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

(3)静态成员和实例成员的调用规则

  • 静态成员由类名调用,也可以由对象名调用,但是不推荐使用对象名调用。
  • 实例成员由对象名调用,不能使用类名调用。

这种调用规则是因为

  • 静态属于类成员,因此静态成员也称为类成员(类变量,类方法)
  • 实例属于对象成员

(4)静态块的作用

  • 实例属性可以通过构造函数初始化。
  • 静态属性可以通过静态块初始化,因为类名首次出现时先为静态变量分配内存,然后再调用静态块。

2.3Java中的变量

  • 值不可以更改的变量称为变量
  • 使用static final修饰的变量是类常量
  • 使用final修饰的变量是实例变量
  • final可以修饰类、属性、方法。修饰类时不能被继承,修饰方法时不能被子类重写,修饰属性时属性不能改值

例如:

public class Book{

public static final String NAME;//定义类常量

public final int price;//定义实例常量

public Book(int price){

this.price=price;//在构造函数中实例常量初始化

static{

NAME=“thinking in java”;//在静态块中类常量初始化

3.继承

3.1为什么使用继承?

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

3.2如何实现继承

使用extends关键字实现继承

例如:

class Father{

class Sub extends Father{

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

3.3super与this关键字

super表示父类,this表示子类

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

例如:

*public* PersonnelDept(String name, String responsibility, String manager,*int* count) {

*super*(name,responsibility,manager);

*this*.count = count;

​ }

注:super调用父类构造函数时,必须写在子类构造函数的第一行

通常父类定义的属性由父类负责初始化,子类定义的属性由子类负责初始化。子类通过super(参数列表)的方式将子类构造函数中的参数传递给父类,让父类初始化。

3.3.2super的用法2:在子类的方法中调用父类的方法

例如:

*public* String toString() {

*return* *super*.toString()+"count="+ count;

}

3.4继承中属性的初始化问题

*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* D {

*public* *static* *void* main(String[] args) {

​ C c = *new* C(1, 2, 3);

​ }

}

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

评论