Java学习之路08

Java学习笔记08

工具类中使用静态

  • 在同一个文件夹下,类定义在两个文件中和定义在一个文件中其实是一样的
  • 方法改进为静态后,就可以直接通过类名调用
  • 把构造方法私有化,外界就不能再创建对象了
  • 示例代码
public class ArrayTool {
    //将构造方法私有化,外界就不能再创建对象了
    private ArrayTool() {
        // TODO 自动生成的构造函数存根
    }
    public static void printArray(int[] arr) {
        for(int x = 0;x < arr.length;x++) {
            if(x == arr.length -1) {
                System.out.println(arr[x]);
            
            }else {
                System.out.println(arr[x] + "---");
            }
        }
    }
}

说明书的制作

  • 如何制作一个说明书
  1. 写一个工具类
  2. 对这个类加入文档注释
    示例代码
/*
 * 这是针对数组进行操作的工具类
 * @author lhk
 * @version V1.0
 */
public class ArrayTool {
    //将构造方法私有化,外界就不能再创建对象了
    /**
     * 这是私有构造
     */
    private ArrayTool() {
        // TODO 自动生成的构造函数存根
    }
    
    /*
     * 这是遍历数组的方法
     * @param arr 这是要被遍历的数组
     */
    public static void printArray(int[] arr) {
        for(int x = 0;x < arr.length;x++) {
            if(x == arr.length -1) {
                System.out.println(arr[x]);
            
            }else {
                System.out.println(arr[x] + "---");
            }
        }
    }
    /*
     * 这是获取数组中最大值的方法
     * @param arr 这是获取最大值的数组
     * @return int 返回数组中的最大值
     */
    public static int getMax(int[] arr) {
        int m = arr[0];
        for(int x = 1;x < arr.length;x++) {
            if(arr[x] > m) {
                m = arr[x];
            }
        }
        return m;
    }
}
  1. 用工具解析文档注释
    javadoc工具
  2. 格式
    javadoc -d 目录 -author -version ArrayTool.java
    目录:就可以写一个文件夹的路径

如何使用帮助文档

  1. 打开帮助文档
  2. 点击显示,找到索引,看到输入框
  3. 知道你要找谁?以Scanner举例
  4. 在输入框里面输入Scanner,然后回车
  5. 看包
    java.lang包下的类不需要导入,其他的全部需要导入
    要导入:
    java.util.Scanner
  6. 再简单的看看类的解释和说明,别忘了看看该类的版本
  7. 看类的结构
    成员变量,字段摘要
    构造方法 ,构造方法摘要
    成员方法 ,方法摘要
  8. 学习构造方法
    A:有构造方法 就创建对象
    B:没有构造方法 成员可能都是静态的,所以都是随着类的加载而存在,不会随着对象的创建而创建,所以不需要构造方法。
  9. 看成员方法
    A:左边
    是否静态:如果静态,可以通过类名调用
    返回值类型:人家返回什么,你就用什么接收
    B:右边
    看方法名:方法名称不要写错
    参数列表:人家要什么,你就给什么;人家要几个,你就给几个

代码块的概述和分类

  • 局部代码块
  1. 处于局部位置,用于限定变量的生命周期
  • 构造代码块
  1. 在类中的成员位置,用{}括起来的代码,每次调用方法执行前,都会先执行构造代码块
  2. 作用:可以把多个构造方法中的共同代码放在一起,对对象进行初始化
  • 静态代码块
  1. 在类中的成员位置,用{}括起来的代码,只不过它用static 修饰了
  2. 作用:一般是对类进行初始化
  • Attension
  1. 它们的执行顺序为:
    静态代码块---构造代码块---构造方法
    静态代码块:只执行一次
    构造代码块:每次调用构造方法都执行
  • 示例代码
class Code {
    //静态代码块
    static{
        int a = 104;
        System.out.println(a);
    }
    //构造代码块
    {
        int x = 1024;
        System.out.println(x);
    }
    
    public Code() {
        System.out.println("code");
    }
    
    {
        int x = 102;
        System.out.println(x);
    }
}

public class CodeDemo {
    public static void main(String[] args) {
        //局部代码块,用于限定变量的生命周期
        {
        int x = 10;
        System.out.println(x);
        }
        System.out.println("-------");
        Code c = new Code();
        System.out.println("-------");
        Code c2 = new Code();
    }
}

继承的引入

  • 我们把多个类中相同的内容定义到一个独立的类中,然后让这多个类和这个独立的类产生一个关系,有了这个关系后,这多个类可以具备这个独立的类的功能,为了实现这个效果,Java 就提供了一个技术:继承
  • 代码示例
//继承格式如下
class Fu{
    String name;
    int age;
    public Fu() {

    }

    public void eat() {
        System.out.println("lhk");
    }
}

class Zi extends FU {
    public Zi() {

    }
}
  • 继承的好处
  1. 提高代码的复用性
  2. 提高代码的维护性
  3. 让类与类之间产生了关系,是多态的前提(这也是一个弊端,因为类的耦合性增强了)

开发的原则:低耦合,高聚合。
耦合:类与类的关系
内聚:就是自己完成某件事的能力

Java中类的继承特点

  • Java 只支持单继承,不支持多继承
  • Java 支持多层继承(继承体系)
  • 代码示例
class G {
    public void show() {
        System.out.println("lhk");
    }
}

class F extends G {
    public void method() {
        System.out.println("ppn");
    }
}

class S extends F {
    
}

public class ExtendsDemo {
    public static void main(String[] args) {
        S s = new S();
        s.method();
        s.show();
    }
}

继承的注意事项

  • 子类只能继承父类中所有非私有成员(成员方法和成员变量)
  • 子类不能继承父类的构造方法,但是可以通过super(后面学)关键字去访问父类构造方法
  • 不要为了部分功能而去继承

this 和 super 的区别和应用

  • this 代表对本类的引用
  • super 代表父类存储空间的标识(理解为父类的引用,可以操作父类的成员)
  • 使用:
  1. 调用构造方法

this(...) 调用本类的构造方法
super(...) 调用父类的构造方法

  • 代码示例
class F2 {
    public int num = 10;    
}

class S2 extends F2 {
    public int num = 20;
    
    public void show() {
        int num = 30;
        System.out.println(num);
        System.out.println(this.num);
        System.out.println(super.num);
    }
}
public class ExtendsDemo2 {
    public static void main(String[] args) {
        S2 s = new S2();
        s.show();
    }
}

继承中构造方法的关系

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

原因:因为子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化之前,一定要先完成父类数据的初始化
注意:子类每一个构造方法的第一条语句默认都是:super();

  • 代码示例
class F3 {
    public F3() {
        System.out.println("F3的无参构造方法");
    }
    
    public F3(String name) {
        System.out.println("F3有参");
    }
}

class S3 extends F3 {
    public S3() {
        System.out.println("S3的无参构造方法");
    }
    
    public S3(String name) {
        System.out.println("S3有参");
    }
}
public class superDemo {
    public static void main(String[] args) {
        S3 s = new S3();
        System.out.println("------");
        S3 s2 = new S3("lhk");
        
    }
}

继承中构造方法的注意事项

  • 如果父类中没有无参构造方法,那么自己的构造方法会出现什么呢?又该如何解决?
  1. 在父类中加一个无参构造方法
  2. 通过super关键字去显示调用父类的带参构造方法
  3. 子类通过this关键字去调用本类的其他构造方法(子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化)
  4. 注意:this和super的使用必须出现在第一条语句上,如果不是放在第一条语句上,就可能对父类数据多次初始化引起报错
  5. 代码示例
class F4 {
    //public F4() {
        
    //}

    public F4(String name) {
        System.out.println("F4带参构造");
    }
}

class S4 extends F4 {
    public S4() {
        super("lhk");
        System.out.println("S4的无参构造");
    }
    
    public S4(String name) {
        //super("lhk");
        this();
        System.out.println("S4的有参构造");
    }
}

public class ExtendDemo3 {
    public static void main(String[] args) {
        S4 s = new S4();
        System.out.println("------");
        S4 ss  = new S4("lhk");
    }
}

继承中的面试题2

  • 静态的内容是随着类的加载而加载
  • 静态代码块的内容会优先执行
  • 子类初始化之前会先进行父类的初始化
  • 代码示例:
class F5 {
    static {
        System.out.println("lhk");
    }
    
    {
        System.out.println("ppn");
    }
    
    public F5() {
        System.out.println("jjj");
    }
}

class S5 extends F5{
    static {
        System.out.println("hsf");
    }
    
    {
        System.out.println("al");
    }
    
    public S5() {
        System.out.println("qjx");
    }
}
public class ExtendDemo4 {
    public static void main(String[] args) {
        S5 s = new S5();
    }
}

继承中的面试题3

  • 一个类的初始化过程
  1. 成员变量的初始化
    默认初始化
    显示初始化
    构造方法初始化
  • 子父类的初始化(分层初始化
  1. 先进行父类初始化,然后进行子类初始化
  2. 问题:虽然子类中的构造方法默认有一个super(),但初始化的时候,不是按照那个顺序进行的。而是按照分层初始化进行的,它仅仅表示要先初始化父类数据,再初始化子类数据。
  3. 代码示例:
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");
    }
    public static void main(String[] args) {
        new Z();
    }
}
//输出YXYZ

方法重写

  • 方法重写:子类中出现了和父类中方法声明一模一样的方法
  • 方法重写的应用:当子类需要父类的功能,而功能主体子类有自己持有的内容时,可以重写父类中的方法。这样,既沿袭了父类的功能,又定义了子类特有的内容
  • 代码示例:
class Phone {
    public void call(String name) {
        System.out.println(name);
    }
}

class NewPhone extends Phone{
    public void call(String name) {
        //System.out.println(name);
        super.call(name);
        System.out.println("听天气预报了");
    }
    
}
public class ExtendsDemo6 {
    public static void main(String[] args) {
        NewPhone np = new NewPhone();
        np.call("lhk");
    }
}

方法重写的注意事项

  • 父类中私有方法不能被重写
  1. 因为父类私有方法子类根本就无法继承
  • 子类重写父类方法时,访问权限不能更低
  1. 最好一致
  • 父类静态方法,子类也必须通过静态方法进行重写(其实这个算不上方法重写,至于为什么,多态中讲解)
  • 代码示例:
class F7 {
    //public void show() {}
    void show() {
        System.out.println("show lhk");
    }
}

class S7 extends F7 {
    //private void show() { 
    //}
    
    void show() {
        System.out.println("show ppn");
    }
}

public class ExtendsDemo7 {
    public static void main(String[] args) {
        S7 s = new S7();
        s.show();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容