zoukankan      html  css  js  c++  java
  • 黑马程序员----java基础笔记上(毕向东)

    笔记一共记录了毕向东的java基础的25天课程,分上、中、下

    本片为上篇,涵盖前10天课程

    1.

    定义类,类如果要独立运行,得有一个main函数,类似c语言的main函数。配置path,使用javac编译类生成字节码文件,使用java命令执行class文件。

    2.

    负数的二进制

    进制转换

    与-或-异或

    左移和右移

    3.

    控制语句 For  While if-switch

    4.

    数组、二维数组、排序

    5.

    基本数据类型传参

    基本数据类型是存储在栈中,函数执行完毕后,退出栈

    数组类型参数传参是地址传递

    引用数据类型传参也是地址传递

    面向对象编程(人开门)

    /*
    人开门:名词提炼法。
    人
    {
        开门(门)
        {
            门.开();
        }
    }
    
    门
    {
        开(){操作门轴等。}
    }
    
    */

    6.

    javase概述 

    /*
    1,java语法(变量,语句,函数,数组),
    2,面向对象(类和对象的关系,封装(机箱故事),继承,多态,构造函数,this,static,内部类,抽象类,接口)
    3,多线程。
    4,JavaApi(其实就是java给我们提供的已经定义好的对象。工具对象:集合框架)
    5,输入输出(IO)
    6,java的图形界面。--事件监听机制。
    7,网络通讯。Socket

    web基础知识:
    1,HTML。
    2,CSS
    3,JavaScript
    4,DOM。

    */

    对象调用方法过程

    对象的饿汉式加载

    /*
    什么使用静态?

    要从两方面下手:
    因为静态修饰的内容有成员变量和函数。
    什么时候定义静态变量(类变量)呢?
    当对象中出现共享数据时,该数据被静态所修饰。
    对象中的特有数据要定义成非静态存在于堆内存中。

    什么时候定义静态函数呢?

    当功能内部没有访问到肺静态数据(对象的特有数据),
    那么该功能可以定义成静态的。

    */

    7.

    抽象、继承、Final、接口、模板

    /*
    当多个类中出现相同功能,但是功能主体不同,
    这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。

    抽象:看不懂。

    抽象类的特点:
    1,抽象方法一定在抽象类中。
    2,抽象方法和抽象类都必须被abstract关键字修饰。
    3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
    4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
    如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。


    抽象类和一般类没有太大的不同。
    该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。
    这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。
    通过抽象方法来表示。

    抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。
    抽象类不可以实例化。


    特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。


    练习:

    abstract 关键字,和哪些关键字不能共存。
    final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
    private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。
    而抽象方法出现的就是需要被复写。
    static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。
    可是抽象方法运行没意义。

    抽象类中是否有构造函数?
    有,抽象类是一个父类,要给子类提供实例的初始化。

    */

    abstract class Student
    {
    abstract final void study();
    //abstract void study1();
    void sleep()
    {
    System.out.println("躺着");
    }
    }
    /*

    class ChongCiStudent extends Student
    {
    void study()
    {
    System.out.println("chongci study");
    }
    }

    class BaseStudent extends Student
    {
    void study()
    {
    System.out.println("base study");
    }
    }

    class AdvStudent extends Student
    {
    void study()
    {
    System.out.println("adv study");
    }
    }
    */
    class AbstractDemo
    {
    public static void main(String[] args)
    {
    //new Student();
    //new BaseStudent().study();
    }
    }

    Java语言中:java只支持单继承,不支持多继承。

    因为多继承容易带来安全隐患:当多个父类中定义了相同功能,
    当功能内容不同时,子类对象不确定要运行哪一个。
    但是java保留这种机制。并用另一种体现形式来完成表示。多实现。


    java支持多层继承。也就是一个继承体系

    如何使用一个继承体系中的功能呢?

    想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
    通过了解共性功能,就可以知道该体系的基本功能。
    那么这个体系已经可以基本使用了。
    那么在具体调用时,要创建最子类的对象,为什么呢?
    一是因为有可能父类不能创建对象,
    二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。

    简单一句话:查阅父类功能,创建子类对象使用功能。

    /*
    子父类出现后,类成员的特点:

    类中成员:
    1,变量。
    2,函数。
    3,构造函数。

    1,变量
    如果子类中出现非私有的同名成员变量时,
    子类要访问本类中的变量,用this
    子类要访问父类中的同名变量,用super。

    super的使用和this的使用几乎一致。
    this代表的是本类对象的引用。
    super代表的是父类对象的引用。

    */

    /*
    2,子父类中的函数。

    当子类出现和父类一模一样的函数时,
    当子类对象调用该函数,会运行子类函数的内容。
    如同父类的函数被覆盖一样。

    这种情况是函数的另一个特性:重写(覆盖)


    当子类继承父类,沿袭了父类的功能,到子类中,
    但是子类虽具备该功能,但是功能的内容却和父类不一致,
    这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。


    覆盖:
    1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。

    2,静态只能覆盖静态。


    记住大家:
    重载:只看同名函数的参数列表。
    重写:子父类方法要一模一样。
    */

    /*
    3,子父类中的构造函数。

    在对子类对象进行初始化时,父类的构造函数也会运行,
    那是因为子类的构造函数默认第一行有一条隐式的语句 super();
    super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();

    为什么子类一定要访问父类中的构造函数。

    因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
    所以子类在对象初始化时,要先访问一下父类中的构造函数。
    如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

    注意:super语句一定定义在子类构造函数的第一行。

    子类的实例化过程。

    结论:
    子类的所有的构造函数,默认都会访问父类中空参数的构造函数。
    因为子类每一个构造函数内的第一行都有一句隐式super();

    当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

    当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
    子类中至少会有一个构造函数会访问父类中的构造函数。
    */

    /*
    final : 最终。作为一个修饰符,
    1,可以修饰类,函数,变量。
    2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
    3,被final修饰的方法不可以被复写。
    4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量。
    当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。
    而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。
    单词间通过_连接。
    5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

    */

    /*
    接口:初期理解,可以认为是一个特殊的抽象类
    当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
    class用于定义类
    interface 用于定义接口。

    接口定义时,格式特点:
    1,接口中常见定义:常量,抽象方法。
    2,接口中的成员都有固定修饰符。
    常量:public static final
    方法:public abstract
    记住:接口中的成员都是public的。


    接口:是不可以创建对象的,因为有抽象方法。
    需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。
    否则子类是一个抽象类。

    接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。

    */

    模板方法设计模式

    /*
    需求:获取一段程序运行的时间。
    原理:获取程序开始和结束的时间并相减即可。

    获取时间:System.currentTimeMillis();

    当代码完成优化后,就可以解决这类问题。

    这种方式,模版方法设计模式。

    什么是模版方法呢?
    在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,
    那么这时就将不确定的部分暴露出去。由该类的子类去完成。

    */

    abstract class GetTime
    {
        public final void getTime()
        {
            long start = System.currentTimeMillis();
    
            runcode();
    
            long end = System.currentTimeMillis();
    
            System.out.println("毫秒:"+(end-start));
        }
        public abstract void runcode();
    
    }
    
    
    class SubTime extends GetTime
    {
    
        public void runcode()
        {
            
            for(int x=0; x<4000; x++)
            {
                System.out.print(x);
            }
        }
    }
    
    
    class  TemplateDemo
    {
        public static void main(String[] args) 
        {
            //GetTime gt = new GetTime();
            SubTime gt = new SubTime();
            gt.getTime();
        }
    }

    8.

    接口和抽象类的不同

    多态示例

    继承:
    特点:
    1,提高了代码的复用性。
    2,让类与类之间产生关系,是多态性的前提。

    Java中的继承。
    1,java只支持单继承,不支持多继承。为啥呢?答案:因为继承了多个父类如果有相同方法时,
    子类对象不确定运行哪一个。
    2,Java还支持多层继承。A-->B--->C 原来可以形成继承体系。
    想要使用体系功能,"查阅父类功能,建立子类对象调用功能。"
    注解:父类的由来其实是由事物中的共性内容不断向上抽取而来的。
    所以父类中定义的是该体系中的最基本,最共性功能。

    继承出现后,代码上也有一些特点:
    1,变量。
    当子父类中定义了相同的名称的成员变量,
    子类要使用父类中的同名变量时,需要使用关键字super来区分。
    一般不会出现这种情况,因为父类中有了,子类不需要定义。
    而且父类定义时,一般变量都私有化。

    2,函数。
    子类可以直接访问父类中非私有的成员函数。
    特殊情况:当子类中定义了与父类一模一样的方法时,会发生覆盖操作。大多指的是非静态方法。
    最终会运行子类的方法,父类相当于被覆盖了。
    函数的另一个特性:覆盖(重写,复写)。
    什么时候用啊?
    当父类的功能要被修改时,不建议修改源码。因为是灾难。
    只要通过一个类继承原有类,定义一个新的升级后的功能即可。
    但是功能是相同的,只是实现方法改变。这是子类可以沿袭父类中的功能定义,
    并重写功能内容。这就是覆盖。

    覆盖很爽,但是有注意事项:
    1,子类覆盖父类时,必须权限要大于等于父类权限。
    2,静态不能覆盖非静态。

    3,构造函数。
    构造函数可以本类进行对象初始化,也可以给子类对象进行初始化。
    子类对象初始化过程:
    子类中的所有构造方法都会访问父类中空参数的构造函数,
    因为每一个构造函数的第一行,都有一句隐式的super语句。
    为什么要有这条语句?
    因为子类会获取到父类中的数据,必须要先明确父类对数据的初始化过程。

    当父类中没有空参数构造函数时,子类构造函数必须通过super句来明确要访问的父类中指定的构造函数。

    当时子类构造函数也可以通过this语句访问本类中的构造函数。
    但是子类中肯定,至少有一个构造函数会访问父类。


    抽象类:其实就是在分析事物时,事物中的功能有些是不明确的内容的。这些不明确内容就是抽象的。
    可以通过抽象函数来描述。

    抽象函数一定要定义在抽象类中,因为,抽象函数所在类,也必须被抽象标识。

    写法特点:
    1,抽象函数只对函数进行声明,没有函数主体。
    2,抽象类和抽象函数都需要用abstract修饰。
    3,抽象类不可以进行实例化。
    4,想要使用抽象功能,必须通过子类覆盖了父类中所有的抽象方法后,才可以对子类实例化。
    如果只覆盖了部分抽象方法,那么子类还是一个抽象类。

    也可以理解为:抽象类是一个父类,是不断向上抽取而来的,
    在抽取过程中,只抽取了方法声明,但没有抽取方法实现。

    抽象类和一半类差不多。
    区别:
    抽象类可以定义抽象方法。
    抽象类不可以建立对象。

    其实抽象类一样用于描述事物,既可以定义抽象方法,也可以定义非抽象方法。

    9.

    一。表现:
    父类或者接口的引用指向了或者接收了自己的子类对象。

    二。前提:
    1,类与类之间要有关系。继承,实现。
    2,通常都会有覆盖。

    三。好处:
    预先定义的程序可以运行后期程序的内容。
    增强了程序的扩展性。

    四。弊端:
    虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。
    不能预先使用子类中定义的特有功能。

    五。多态的注意事项:
    在代码中。
    对于成员函数:Fu f = new Zi(); f.method();
    编译时期:看左边。
    运行时期:看右边。
    因为成员函数有一个覆盖操作。
    毕姥爷和毕老师的故事。


    对于非私有的实例变量,
    静态变量,静态方法。

    编译和运行都看左边。

    老师要求记住结论。有空闲时间,就想想为什么?

    六。转型。
    子类对象被父类引用:子类对象在向上转型。
    将指向子类对象的父类应用转换成子类类型引用:向下转型。

    毕姥爷和毕老师的故事。
    class 毕姥爷
    {}

    class 毕老师 extends 毕姥爷
    {}

    毕姥爷 ly = new 毕老师();//毕老师向上转型为了毕姥爷。向上转型

    毕老师 ls = (毕老师)ly; //将代表毕老师对象的父类引用ly强制转换成了毕老师类型。向下转型。

    七。应用
    电脑使用。主板运行。

    class MainBoard
    {
    public void run()
    {
    //主板运行;
    }
    public void usePCI(PCI p)//PCI p = new NetCard();
    {
    if(p!=null)
    {
    p.open();
    p.close();
    }
    }
    }


    //为了提高主板功能的扩展性。
    //定义了规则。让后期的出现的功能板块,只要覆盖该规则,就可以被这个主板使用。
    interface PCI
    {
    void open();
    void close();
    }


    class MainDemo
    {
    public static void main(String[] args)
    {
    MainBoard mb = new MainBoard();
    mb.run();
    mb.usePCI(null);
    mb.usePCI(new NetCard());

    }
    }


    class NetCard implements PCI
    {
    public void open(){}
    public void close(){}
    }


    Object:是java中所有对象的直接或者间接的父类。
    它里面的方法都所有对象都具备的。
    常见方法:
    boolean equals(Object obj):用于比较两个对象是否相同。
    String toString(): 获取对象的字符串表现形式 类名@哈希值
    getClass().getName()+"@"+Integer.toHexString(hashCode());
    Class getClass():获取正在运行的对象所属的字节码文件的对象。也就是说如果Demo d = new Demo();
    d.getClass():获取的就是d执行的对象所属的字节码文件Demo.class对象。

    通常在自定义对象时,因为对象中都有自己特有的描述,
    所以都会建立对象自身的特有比较方法,或者字符串表现形式。
    也就是说,会覆盖Object中的方法。

    10.

    异常:
    是什么?是对问题的描述。将问题进行对象的封装。
    ------------
    异常体系:
    Throwable
    |--Error
    |--Exception
    |--RuntimeException

    异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。
    也就是说可以被throw和throws关键字所操作。
    只有异常体系具备这个特点。


    --------------
    throw和throws的用法:

    throw定义在函数内,用于抛出异常对象。
    throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。


    当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,都在编译失败。
    注意,RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。
    --------------


    如果函数声明了异常,调用者需要进行处理。处理方法可以throws可以try。

    异常有两种:
    编译时被检测异常
    该异常在编译时,如果没有处理(没有抛也没有try),编译失败。
    该异常被标识,代表这可以被处理。
    运行时异常(编译时不检测)
    在编译时,不需要处理,编译器不检查。
    该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

    --------------
    异常处理语句:
    try
    {
    需要被检测的代码;
    }
    catch ()
    {
    处理异常的代码;
    }
    finally
    {
    一定会执行的代码;
    }

    有三个结合格式:
    1. try
    {

    }
    catch ()
    {
    }

    2. try
    {

    }
    finally
    {

    }


    3. try
    {

    }
    catch ()
    {
    }
    finally
    {

    }

    注意:
    1,finally中定义的通常是 关闭资源代码。因为资源必须释放。
    2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

    --------------

    自定义异常:
    定义类继承Exception或者RuntimeException
    1,为了让该自定义类具备可抛性。
    2,让该类具备操作异常的共性方法。

    当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
    异常异常信息传递给父类的构造函数。
    class MyException extends Exception
    {
    MyException(String message)
    {
    super(message);
    }
    }

    自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。
    --------------


    异常的好处:
    1,将问题进行封装。
    2,将正常流程代码和问题处理代码相分离,方便于阅读。


    异常的处理原则:
    1,处理方式有两种:try 或者 throws。
    2,调用到抛出异常的功能时,抛出几个,就处理几个。
    一个try对应多个catch。
    3,多个catch,父类的catch放到最下面。
    4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。
    也不要不写。
    当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
    try
    {
    throw new AException();
    }
    catch (AException e)
    {
    throw e;
    }

    如果该异常处理不了,但并不属于该功能出现的异常。
    可以将异常转换后,在抛出和该功能相关的异常。

    或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,
    当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。
    try
    {
    throw new AException();
    }
    catch (AException e)
    {
    // 对AException处理。
    throw new BException();
    }

    比如,汇款的例子。


    异常的注意事项:
    在子父类覆盖时:
    1,子类抛出的异常必须是父类的异常的子类或者子集。
    2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

  • 相关阅读:
    EasyUI的datagrid在IE下解决缓存的方案
    [置顶] 【Mybatis】---mybatis+mysql+ IntelliJ IDEA框架搭建+实例讲解
    【深入分析JavaWeb】-DNS域名解析
    hibernate对JPA_Annotation的支持实例讲解
    【hibernate进阶】hql简单属性查询
    LeetCode 10. 正则表达式匹配
    机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(七)
    机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(六)
    机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(五)
    机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(四)
  • 原文地址:https://www.cnblogs.com/YonguiL/p/4403034.html
Copyright © 2011-2022 走看看