文档注释和帮助文档
文档注释
/**
*这是针对猫对象相关的工具类
*@author xx
*version V.1.0
*/
class Cat{
/**
*这是无参构造方法
*/
Cat(){
}
/**
*这是猫吃饭的方法,XXXXX
*@param str 这是调用该方法需要传入的参数
*/
public void eat(String str){
}
}
制作帮助文档(API)
在cmd中跳到java文件目录下,输入
javadoc -d 目录 -author -version Cat.java
即可生成API(-d 目录 是要讲API输出到哪个目录下)
注意:API内如果是java.lang包下的类,可以直接使用,要是别的类则需要导入包才能使用
如果找到的类里面没有构造方法那么,这个类的成员一般都是静态,可以通过类名调用
代码块
在java中,使用{}括起来的代码被称为代码块都被成为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程部分说)
局部代码块
在方法中出现,,限定变量生命周期,及早释放,提高内存利用率
构造代码块
在类中方法外出现,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并在构造方法前执行
静态代码块
在类中方法外出现,并加上static修饰,用于给类进行初始化,在类加载的时候就执行,并且只执行一次
执行顺序
局部代码块--->静态代码块--->构造代码块--->构造方法
静态代码块,构造代码块,静态方法的执行顺序。
static {
System.out.println(“静态代码块”);
}
{
System.out.println(“构造代码块”);
}
public Student() {
System.out.println(“构造方法”);
}
结果:静态代码块
构造代码块
构造方法
继承
概述
当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无须在定义这些属性和行为,只要继承那个类即可
class Cat extends Animal{}
Cat会继承Animal所有的非private的成员
优点
提高了代码的复用性,多个类相同的成员可以放到同一个类
提高了代码的维护性,如果功能的代码需要修改,修改一处即可
让类与类之间产生了关系,是多态的前提,但这也是继承的弊端:类的耦合性很强
设计程序原则:
高内聚低耦合
(简单理解:内聚就是自己完成事情的能力,耦合就是类与类之间的关系)
特点
1、java只支持单继承,不支持多继承
2、java支持多层继承(继承体系)(简单理解,就是套娃)
注意事项
1、子类只能继承父类所有非私有的成员(成员变量和成员方法)
2、子类不能继承父类的构造方法,但可以通过super关键字来访问父类构造方法
3、不要为了部分功能而去继承,当两个类存在继承(父子)关系的时候才使用继承
4、private不能被直接继承或者访问,但可以间接使用
//父类private修饰的成员变量被间接使用
public class Test02 {
public static void main(String[] args) {
Manager m=new Manager("q",1);
m.show();
}
}
class User {
private String name;
private int money;
public User() {
}
public User(String name, int money) {
this.name = name;
this.money = money;
}
public String getName() {
return name;
}
public int getMoney() {
return money;
}
}
class Manager extends User {
public Manager() {
}
public Manager(String name, int money) {
super(name, money);
}
private String name;
private int money;
public void show(){
System.out.println("我是"+this.name+",我有"+this.money+"元钱");
System.out.println("我是"+this.getName()+",我有"+this.getMoney()+"元钱");
System.out.println("我是"+super.getName()+",我有"+super.getMoney()+"元钱");
}
}
super关键字
super的用法和this很像
this代表当前对象的引用
super代表父类存储空间的标识(可以理解为父类引用)
用法
访问成员变量
this. 成员变量 super. 成员变量
访问构造方法
this(...) super(...)
访问成员方法
this.成员方法() super.成员方法()
继承中成员变量的关系
在子类方法中访问一个变量
首先在子类局部范围找
然后在子类成员范围找
最后在父类成员范围找(肯定不能访问到父类局部范围)
如果还是没有就报错(不考虑父亲的父亲)
一般都是通过super关键字去调用
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化(注意:调用无参构造方法并非单纯的只调用构造这个方法,而是将整个类初始化)
每一个构造方法的第一条语句默认都是:super()
如果父类没有无参构造方法呢?
子类通过this去调用本类的其他构造方法(本类其他构造也必须首先访问父类构造)
一句话概括就是想办法在访问子类构造方法的时候访问父类构造方法
注意:super(。。。)或者this(。。。)必须出现在第一条语句上,否则就会有父类数据的多次初始化(因为构造方法内的第一条语句默认super())
//面试题
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
Zi z = new Zi();
//请执行结果。
A:静态随着类的加载而加载。(因为当zi类和fu类加载的时候,静态就同步加载了)
B:静态代码块 -- 构造代码块 -- 构造方法的执行流程
静态代码块 -- 构造代码块 -- 构造方法
C:只要有子父关系,肯定先初始化父亲的数据,然后初始化子类的数据。
结果:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
继承中成员方法的关系
通过子类对象去访问一个方法
首先在子类中找
然后在父类中找
如果还是没有就报错(不考虑父类的父类)
一般是通过super关键字去访问成员方法
方法重写
子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写
特点
如果方法名不同,就调用对应的方法
如果方法名相同,最终使用的是子类自己的
应用
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的功能
注意事项
1、父类中私有方法不能被重写
2、子类重写父类方法时,访问权限不能更低(意思就是子类重写方法的权限最起码要大于等于父类方法的权限)
3、父类静态方法,子类也必须通过静态方法进行重写(若划分严格一点,这个不算重写,学了多态后会有理解)
常见面试题
1、方法重写和方法重载的区别?方法重载能改变返回值类型吗?
2、this关键字和super关键分别代表什么?以及他们各自的使用场景和作用