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传递给父类初始化。
评论