天天看点

Java基础-08总结帮助文档,代码块,继承

1:如何制作帮助文档(了解)

(1)写一个类

(2)加入文档注释

(3)通过javadoc工具生成即可

javadoc -d 目录 -author -version arraytool.java

/*

我想要对数组进行操作

在同一个文件夹下,类定义在两个文件中和定义在一个文件中其实一样的。

*/

class arraydemo {

public static void main(string[] args) {

//定义数组

int[] arr = {28,55,37,46,19};

//需求:遍历数组

for(int x=0; x<arr.length; x++) {

if(x == arr.length-1) {

system.out.println(arr[x]);

}else {

system.out.print(arr[x]+", ");

}

//如果我有多个数组都要进行遍历,那么,代码的重复度就很高

//如何改进呢?用方法改进

//调用

//静态方法

//printarray(arr);

//非静态方法

//arraydemo ad = new arraydemo();

//ad.printarray(arr);

//测试类的作用:创建其他类的对象,调用其他类的功能。

//而我们现在的操作是跟数组相关的,所以,你应该把这些操作定义到数组操作类中

//定义一个数组的操作类

//有了数组操作类之后的调用

//arraytool at = new arraytool();

//at.printarray(arr);

//方法改进为静态后,就可以直接通过类名调用

arraytool.printarray(arr);

public static void printarray(int[] arr) {

//假设该方法不是静态的

public void printarray(int[] arr) {

lass arraytool {

//把构造方法私有,外界就不能在创建对象了

private arraytool(){}

如何制作一个说明书呢?

a:写一个工具类

b:对这个类加入文档注释

怎么加呢?

加些什么东西呢?

c:用工具解析文档注释

javadoc工具

d:格式

目录:就可以写一个文件夹的路径

制作帮助文档出错:

找不到可以文档化的公共或受保护的类:告诉我们类的权限不够

//遍历

//获取最值

int max = arraytool.getmax(arr);

system.out.println("max:"+max);

//获取55的索引值

int index = arraytool.getindex(arr,55);

system.out.println("index:"+index);

/**

* 这是针对数组进行操作的工具类

* @author 刘意

* @version v.10

public class arraytool {

* 这是私有构造

* 这是遍历数组的方法,遍历后的格式是:[元素1, 元素2, 元素3, ...]

* @param arr 这是要被遍历的数组

system.out.print("[");

system.out.println(arr[x]+"]");

* 这是获取数组中最大值的方法

* @param  arr 这是要获取最大值的数组

* @return 返回数组中的最大值

public static int getmax(int[] arr) {

int max = arr[0];

for(int x=1; x<arr.length; x++) {

if(arr[x] > max) {

max = arr[x];

return max;

* 获取指定元素在数组中第一次出现的索引,如果元素不存在,就返回-1

* @param arr 被查找的数组 

* @param value 要查找的元素

* @return 返回元素在数组中的索引,如果不存在,返回-1

public static int getindex(int[] arr,int value) {

int index = -1;

if(arr[x] == value) {

index = x;

break;

return index;

2:通过jdk提供的api学习了math类(掌握)

(1)api(application programming interface)

应用程序编程接口(帮助文档)

(2)如何使用呢?

请参照

day08\code\02_如何使用jdk提供的帮助文档\如何使用帮助文档.txt

(3)math类

a:是针对数学进行操作的类

b:没有构造方法,因为它的成员都是静态的

c:产生随机数

public static double random(): [0.0,1.0)

d:如何产生一个1-100之间的随机数

int number = (int)(math.random()*100)+1;

e:猜数字小游戏

math:类包含用于执行基本数学运算的方法

由于math类在java.lang包下,所以不需要导包。

特点:

没有构造方法,因为它的成员全部是静态的。

掌握一个方法:

获取随机数

public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。

class mathdemo {

//获取一个随机数

//double d = math.random();

//system.out.println(d);

//需求:我要获取一个1-100之间的随机数,肿么办?

for(int x=0; x<100; x++) {

system.out.println(number);

猜数字小游戏(数据在1-100之间)

分析:

a:程序产生一个随机数。(被猜的)

b:键盘录入数据。(你猜的)

c:把你猜的和被猜的进行比较

a:大了

b:小了

c:猜中了

d:给出多次猜的机会,猜中就结束。

while()循环,猜中就break

import java.util.scanner;

class guessnumber {

//程序产生一个随机数。(被猜的)

//system.out.println(number);

//给出多次猜的机会,猜中就结束。

while(true) {

//键盘录入数据。(你猜的)

scanner sc = new scanner(system.in);

system.out.println("请输入你要猜的数据(1-100):");

int guessnumber = sc.nextint();

//把你猜的和被猜的进行比较

if(guessnumber > number) {

system.out.println("你猜的数据"+guessnumber+"大了");

}else if(guessnumber < number) {

system.out.println("你猜的数据"+guessnumber+"小了");

system.out.println("恭喜你,猜中了");

3:代码块(理解)

(1)用{}括起来的代码。

(2)分类:

a:局部代码块

用于限定变量的生命周期,及早释放,提高内存利用率。

b:构造代码块

把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。

c:静态代码块

对类的数据进行初始化,仅仅只执行一次。

(3)静态代码块,构造代码块,构造方法的顺序问题?

静态代码块 > 构造代码块 > 构造方法

代码块:在java中,使用{}括起来的代码被称为代码块。

根据其位置和声明的不同,可以分为

局部代码块:局部位置,用于限定变量的生命周期。

构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。

作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。

静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。

作用:一般是对类进行初始化。

面试题?

静态代码块,构造代码块,构造方法的执行顺序?

静态代码块 -- 构造代码块 -- 构造方法

静态代码块:只执行一次

构造代码块:每次调用构造方法都执行

class code {

static {

int a = 1000;

system.out.println(a);

//构造代码块

{

int x = 100;

system.out.println(x);

//构造方法

public code(){

system.out.println("code");

public code(int a){

int y = 200;

system.out.println(y);

//静态代码块

int b = 2000;

system.out.println(b);

class codedemo {

//局部代码块

int x = 10;

//找不到符号

//system.out.println(x);

int y = 20;

system.out.println("---------------");

code c = new code();

code c2 = new code();

code c3 = new code(1);

写程序的执行结果。

林青霞都60了,我很伤心

我是main方法

student 静态代码块

student 构造代码块

student 构造方法

class student {

system.out.println("student 静态代码块");

system.out.println("student 构造代码块");

public student() {

system.out.println("student 构造方法");

class studentdemo {

system.out.println("林青霞都60了,我很伤心");

system.out.println("我是main方法");

student s1 = new student();

student s2 = new student();

4:继承(掌握)

(1)把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,

  这多个类就具备了这些内容。这个关系叫继承。

(2)java中如何表示继承呢?格式是什么呢?

a:用关键字extends表示

b:格式:

class 子类名 extends 父类名 {}

(3)继承的好处:

a:提高了代码的复用性

b:提高了代码的维护性

c:让类与类产生了一个关系,是多态的前提

(4)继承的弊端:

a:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。

原则:低耦合,高内聚。

耦合:类与类的关系

内聚:自己完成某件事情的能力

b:打破了封装性

继承概述:

把多个类中相同的内容给提取出来定义到一个类中。

如何实现继承呢?

java提供了关键字:extends

格式:

好处:

c:让类与类之间产生了关系,是多态的前提

类与类产生了关系,其实也是继承的一个弊端:

类的耦合性增强了。

开发的原则:低耦合,高内聚。

内聚:就是自己完成某件事情的能力

//使用继承前

public void eat() {

system.out.println("吃饭");

public void sleep() {

system.out.println("睡觉");

class teacher {

//使用继承后

class person {

class student extends person {}

class teacher extends person {}

class extendsdemo {

student s = new student();

s.eat();

s.sleep();

system.out.println("-------------");

teacher t = new teacher();

t.eat();

t.sleep();

(5)java中继承的特点

a:java中类只支持单继承

b:java中可以多层(重)继承(继承体系)

java中继承的特点:

a:java只支持单继承,不支持多继承。

有些语言是支持多继承,格式:extends 类1,类2,...

b:java支持多层继承(继承体系)

class father {}

class mother {}

class son exnteds father {} //正确的

class son extends father,mother {} // 错误的

class grandfather {

public void show() {

system.out.println("我是爷爷");

class father extends grandfather {

public void method(){

system.out.println("我是老子");

class son extends father {}

class extendsdemo2 {

son s = new son();

s.method(); //使用父亲的

s.show(); //使用爷爷的

(6)继承的注意事项:

a:子类不能继承父类的私有成员

b:子类不能继承父类的构造方法,但是可以通过super去访问

c:不要为了部分功能而去继承

继承的注意事项:

a:子类只能继承父类所有非私有的成员(成员方法和成员变量)

b:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。

class a {

public void show1(){}

public void show2(){}

class b {

public void show3(){}

//我们发现b类中出现了和a类一样的show2()方法,所以,我们就用继承来体现

class b extends a {

这样其实不好,因为这样你不但有了show2(),还多了show1()。

有可能show1()不是你想要的。

那么,我们什么时候考虑使用继承呢?

继承其实体现的是一种关系:"is a"。

person

student

teacher

水果

苹果

香蕉

橘子

采用假设法。

如果有两个类a,b。只有他们符合a是b的一种,或者b是a的一种,就可以考虑使用继承。

class father {

private int num = 10;

public int num2 = 20;

//私有方法,子类不能继承

private void method() {

system.out.println(num);

system.out.println(num2);

class son extends father {

public void function() {

//num可以在father中访问private

//system.out.println(num); //子类不能继承父类的私有成员变量

class extendsdemo3 {

// 创建对象

//s.method(); //子类不能继承父类的私有成员方法

s.show();

s.function();

(7)什么时候使用继承呢?

a:继承体现的是:is a的关系。

b:采用假设法

(8)java继承中的成员关系

a:成员变量

a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单

b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?

子类的方法访问变量的查找顺序:

在子类方法的局部范围找,有就使用。

在子类的成员范围找,有就使用。

在父类的成员范围找,有就使用。

找不到,就报错。

b:构造方法

a:子类的构造方法默认会去访问父类的无参构造方法

是为了子类访问父类数据的初始化

b:父类中如果没有无参构造方法,怎么办?

子类通过super去明确调用带参构造

子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造

让父类提供无参构造

c:成员方法

a:子类的成员方法和父类中的成员方法名称不一样,这个太简单

b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?

通过子类对象访问一个方法的查找顺序:

在子类中找,有就使用

在父类中找,有就使用

找不到,就报错

类的组成:

成员变量:

构造方法:

成员方法:

而现在我们又讲解了继承,所以,我们就应该来考虑一下,类的组成部分的各自关系。

继承中成员变量的关系:

a:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。

b:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?

在子类方法中访问一个变量的查找顺序:

a:在子类方法的局部范围找,有就使用

b:在子类的成员范围找,有就使用

c:在父类的成员范围找,有就使用

d:如果还找不到,就报错。

public int num = 10;

public void method() {

int num = 50;

public int num = 30;

int num = 40;

// 找不到符号

system.out.println(num3);

class extendsdemo4 {

//创建对象

(9)两个面试题:

a:override和overload的区别?overload是否可以改变返回值类型?

b:this和super的区别和各自的作用?

1:方法重写和方法重载的区别?方法重载能改变返回值类型吗?

方法重写:

在子类中,出现和父类中一模一样的方法声明的现象。

方法重载:

同一个类中,出现的方法名相同,参数列表不同的现象。

方法重载能改变返回值类型,因为它和返回值类型无关。

override:方法重写

overload:方法重载

2:this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。

this:代表当前类的对象引用

super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)

场景:

this.成员变量

super.成员变量

this(...)

super(...)

this.成员方法

super.成员方法

问题是:

我不仅仅要输出局部范围的num,还要输出本类成员范围的num。怎么办呢?

我还想要输出父类成员范围的num。怎么办呢?

如果有一个东西和this相似,但是可以直接访问父类的数据就好了。

恭喜你,这个关键字是存在的:super。

this和super的区别?

分别是什么呢?

this代表本类对应的引用。

super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)

怎么用呢?

a:调用成员变量

this.成员变量 调用本类的成员变量

super.成员变量 调用父类的成员变量

b:调用构造方法

调用本类的构造方法

调用父类的构造方法

c:调用成员方法

this.成员方法 调用本类的成员方法

super.成员方法 调用父类的成员方法

public int num = 20;

int num = 30;

system.out.println(this.num);

system.out.println(super.num);

class extendsdemo5 {

继承中构造方法的关系

a:子类中所有的构造方法默认都会访问父类中空参数的构造方法

b:为什么呢?

因为子类会继承父类中的数据,可能还会使用父类的数据。

所以,子类初始化之前,一定要先完成父类数据的初始化。

注意:子类每一个构造方法的第一条语句默认都是:super();

int age;

public father() {

system.out.println("father的无参构造方法");

public father(string name) {

system.out.println("father的带参构造方法");

public son() {

//super();

system.out.println("son的无参构造方法");

public son(string name) {

system.out.println("son的带参构造方法");

class extendsdemo6 {

system.out.println("------------");

son s2 = new son("林青霞");

如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?

报错。

如何解决呢?

a:在父类中加一个无参构造方法

b:通过使用super关键字去显示的调用父类的带参构造方法

c:子类通过this去调用本类的其他构造方法

子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。

注意事项:

this(...)或者super(...)必须出现在第一条语句上。

如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。

super("随便给");

//super("随便给");

this();

class extendsdemo7 {

system.out.println("----------------");

son ss = new son("林青霞");

继承中成员方法的关系:

a:子类中的方法和父类中的方法声明不一样,这个太简单。

b:子类中的方法和父类中的方法声明一样,这个该怎么玩呢?

通过子类对象调用方法:

a:先找子类中,看有没有这个方法,有就使用

b:再看父类中,有没有这个方法,有就使用

c:如果没有就报错。

system.out.println("show father");

system.out.println("method son");

system.out.println("show son");

class extendsdemo8 {

s.method();

//s.fucntion(); //找不到符号

方法重写:子类中出现了和父类中方法声明一模一样的方法。

本类中出现的方法名一样,参数列表不同的方法。与返回值无关。

子类对象调用方法的时候:

先找子类本身,再找父类。

方法重写的应用:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。

这样,即沿袭了父类的功能,又定义了子类特有的内容。

案例:

a:定义一个手机类。

b:通过研究,我发明了一个新手机,这个手机的作用是在打完电话后,可以听天气预报。

按照我们基本的设计,我们把代码给写出来了。

但是呢?我们又发现新手机应该是手机,所以,它应该继承自手机。

其实这个时候的设计,并不是最好的。

因为手机打电话功能,是手机本身就具备的最基本的功能。

所以,我的新手机是不用在提供这个功能的。

但是,这个时候,打电话功能就没有了。这个不好。

最终,还是加上这个功能。由于它继承了手机类,所以,我们就直接使用父类的功能即可。

那么,如何使用父类的功能呢?通过super关键字调用

class phone {

public void call(string name) {

system.out.println("给"+name+"打电话");

class newphone extends phone {

//system.out.println("给"+name+"打电话");

super.call(name);

system.out.println("可以听天气预报了");

class extendsdemo9 {

newphone np = new newphone();

np.call("林青霞");

方法重写的注意事项

a:父类中私有方法不能被重写

因为父类私有方法子类根本就无法继承

b:子类重写父类方法时,访问权限不能更低

最好就一致

c:父类静态方法,子类也必须通过静态方法进行重写

其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解

子类重写父类方法的时候,最好声明一模一样。

//private void show() {}

void show() {

public static void method() {

class extendsdemo10 {

看程序写结果:

a:成员变量的问题

int x = 10; //成员变量是基本类型

student s = new student(); //成员变量是引用类型

b:一个类的初始化过程

成员变量的初始化

默认初始化

显示初始化

构造方法初始化

c:子父类的初始化(分层初始化)

先进行父类初始化,然后进行子类初始化。

结果:

yxyz

问题:

虽然子类中构造方法默认有一个super()

初始化的时候,不是按照那个顺序进行的。

而是按照分层初始化进行的。

它仅仅表示要先初始化父类数据,再初始化子类数据。

class x {

y b = new y();

x() {

system.out.print("x");

class y {

y() {

system.out.print("y");

public class z extends x {

y y = new y();

z() {

//super

system.out.print("z");

new z(); 

(10)数据初始化的面试题

a:一个类的初始化过程

b:子父类的构造执行过程

c:分层初始化

就近原则

b:this和super的问题

this访问本类的成员

super访问父类的成员

c:子类构造方法执行前默认先执行父类的无参构造方法

d:一个类的初始化过程

成员变量进行初始化

fu

zi

30

20

10

class fu{

public fu(){

system.out.println("fu");

class zi extends fu{

public zi(){

system.out.println("zi");

public void show(){

system.out.println(num); //30

system.out.println(this.num); //20

system.out.println(super.num); //10

class extendstest {

zi z = new zi();

z.show();

a:一个类的静态代码块,构造代码块,构造方法的执行流程

b:静态的内容是随着类的加载而加载

静态代码块的内容会优先执行

c:子类初始化之前先会进行父类的初始化

结果是:

静态代码块fu

静态代码块zi

构造代码块fu

构造方法fu

构造代码块zi

构造方法zi

class fu {

system.out.println("静态代码块fu");

system.out.println("构造代码块fu");

public fu() {

system.out.println("构造方法fu");

class zi extends fu {

system.out.println("静态代码块zi");

system.out.println("构造代码块zi");

public zi() {

system.out.println("构造方法zi");

class extendstest2 {

(11)案例:

a:学生和老师案例

继承前

继承后

学生案例和老师案例讲解

学生:

成员变量;姓名,年龄

构造方法:无参,带参

成员方法:getxxx()/setxxx()

老师:

//定义学生类

//姓名

private string name;

//年龄

private int age;

public student(string name,int age) {

this.name = name;

this.age = age;

public string getname() {

return name;

public void setname(string name) {

public int getage() {

return age;

public void setage(int age) {

//定义老师类

public teacher() {

public teacher(string name,int age) {

class extendstest3 {

//创建学生对象并测试

//方式1

s1.setname("林青霞");

s1.setage(27);

system.out.println(s1.getname()+"---"+s1.getage());

//方式2

student s2 = new student("林青霞",27);

system.out.println(s2.getname()+"---"+s2.getage());

//对应的老师测试我不想了,留给你们自己练习。

看上面两个类的成员,发现了很多相同的东西,所以我们就考虑抽取一个共性的类:

人:

学生 继承 人

老师 继承 人

//定义人类

public person() {

public person(string name,int age) { //"林青霞",27

class student extends person {

public student() {}

public student(string name,int age) { //"林青霞",27

//this.name = name;

//this.age = age;

super(name,age);

class teacher extends person {

class extendstest4 {

//补齐老师类中的代码并进行测试。

b:猫狗案例的分析和实现

猫狗案例讲解

先找到具体的事物,然后发现具体的事物有共性,才提取出一个父类。

猫:

成员变量:姓名,年龄,颜色

getxxx()/setxxx()

eat()

palygame()

狗:

lookdoor()

共性:

把共性定义到一个类中,这个类的名字叫:动物。

动物类:

成员方法:palygame()

成员方法:lookdoor()

//定义动物类

class animal {

//颜色

private string color;

public animal() {}

public animal(string name,int age,string color) {

this.color = color;

public string getcolor() {

return color;

public void setcolor(string color) {

system.out.println("不要睡了,该吃饭了");

//定义猫类

class cat extends animal {

public cat() {}

public cat(string name,int age,string color) {

super(name,age,color);

public void playgame() {

system.out.println("猫玩英雄联盟");

//定义狗类

class dog extends animal {

public dog() {}

public dog(string name,int age,string color) {

public void lookdoor() {

system.out.println("狗看家");

//测试类

class extendstest5 {

//测试猫

cat c1 = new cat();

c1.setname("tom");

c1.setage(3);

c1.setcolor("白色");

system.out.println("猫的名字是:"+c1.getname()+";年龄是:"+c1.getage()+";颜色是:"+c1.getcolor());

c1.eat();

c1.playgame();

cat c2 = new cat("杰瑞",5,"土豪金");

system.out.println("猫的名字是:"+c2.getname()+";年龄是:"+c2.getage()+";颜色是:"+c2.getcolor());

c2.eat();

c2.playgame();

//作业:测试狗

java帮帮今日头条号

Java基础-08总结帮助文档,代码块,继承

java帮帮微信公众号

Java基础-08总结帮助文档,代码块,继承

java帮帮交流群

Java基础-08总结帮助文档,代码块,继承