美文网首页
[Java基础] 类,对象,多态,继承笔记

[Java基础] 类,对象,多态,继承笔记

作者: 杨山炮 | 来源:发表于2018-03-11 22:41 被阅读0次
    1 类和对象的理解
    • 类是同一类事物的抽象描述,有点像模板。
    • 对象是对这一类事物的个体实例化。
    2 接口和多态理解
    • 接口就是一些方法特征的集合(接口是对抽象的抽象)
    • 类对这些特征集合(接口)的不同实现方式即为多态

    Tips:接口在程序开发过程中是对对象的功能提供扩展,定义时需要interface关键字,抽象类是对一类事物的抽象归类,该类中方法功能声明相同,但方法功能主体不同,是对。定义时需要abstract关键字

    3 继承的好处
    • 提高了代码的复用性,节省维护成本
    • 继承的出现让类与类之间产生了关系,提供了多态的前提

    Tips:在Java中只有单继承和多实现,没有多继承(指的是一个类只能有一个直接父类,并不表示不能多层级继承)

    4 继承中变量和方法的特点

    1.0 子父类成员变量的特点
         父类中的成员变量是非私有的,子类中可以直接访问,若父 类中的成员变量私有了,子类是不能直接访问的。
          子父类出现同名变量时在子类中可以通过super.父类属性和方法,通过this关键字区别子类自身的同名变量。

    2.0 子父类成员方法的特点
          优先使用子类方法,子类没有就使用父类,如果出现同名方法就会出现方法重写
         方法重写注意事项:子类的方法权限(public,default,protected,private)必须高于父类才行,否则编译报错。

    5 抽象类定义,特点

         定义:抽象类是Java类中的一种,他是在Java类的基础上对类中的方法进行深度提取,对类中的方法共性只提取出方法声明,不对方法的主体内容进行操作。是对一类事物的共性方法声明,不是对共性方法功能描述

    • 抽象类不可以直接创建对象
    • 抽象类和抽象方法都必须有abstract关键字声明
    • 只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象
    6 接口的概念,用法,特点

         概念:接口是抽象类的抽象,是功能的集合,在程序开发过程中主要是为对象提供扩展功能。
         
    定义:

    public interface <interface_name>{
      abstract methods1(){}
      abstract methods1(){}
    }
    

    Tips:
    接口中的方法均为公共访问的抽象方法,接口中无法定义普通的成员变量,但是可以是public static final <var_type> <var_name>,所以接口中的变量也是常量,子类必须实现接口中所有方法才能实例化。

    实现

    class <class_name> implements <interface_name>(){
          OverRide interface's methods;
    }
    

         在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写所有抽象方法,完成具体的逻辑。

    7 多态

         Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值,多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

    多态成员方法的注意事项:
         当子父类中出现同名的成员方法时,编译时期:参考引用变量所属的类,如果fulei类中没有调用的方法,编译失败。运行时期:参考引用变量所指的对象(子类)所属的类,并运行对象所属类中的成员方法。简而言之:编译看左边,运行看右边。

    多态成员变量的注意事项:
         当子父类中出现同名的成员变量时,多态调用该变量时:编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。运行时期:也是调用引用型变量所属的类中的成员变量。简单记:编译和运行都参考等号的左边。编译运行看左边。

    多态转型
    向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,
         父类类型 变量名 = new 子类类型();多态本身就是向下转型。

    向下转型: 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,
         子类类型 变量名 = (子类类型) 父类类型的变量;

         多态转型的好处与弊端:当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的好处是隐藏了子类类型,提高了代码的扩展性。但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限制。
         当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。当要使用子类特有功能时,就需要使用向下转型(这里在多态中的方法使用上记得看懂   “多态成员变量的注意事项”)

    8 封装、继承、多态的作用
    • 封装:把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
    • 继承:子类会自动拥有父类所有可继承的属性和方法。
    • 多态:配合继承与方法重写提高了代码的复用性与扩展性;如果没有方法重写,则多态同样没有意义。
    9 this关键字在多个构造函数之间的相互调用
    除了构造函数的相互调用之外,this关键字还可以区别局部变量和成员变量 this关键字在Java构造函数之间的调用.png
    10 super关键字在子父类之间的使用
    调用本类中的构造方法
    this(实参列表);
    调用父类中的空参数构造方法
    super();
    调用父类中的有参数构造方法
    super(实参列表);
    

         Tips:如果子类的构造方法第一行写了this调用了本类其他构造方法,那么默认的super调用父类的语句是不会默认存在的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行。
         类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。
         如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。

    注意事项:

    • super: 指的是父类的存储空间(理解为父类的引用)
      调用父类的成员变量:
      super.成员变量;
      调用父类的构造方法:
      super(参数);
      调用方法的成员方法:
      super.成员方法();

    • 继承中的构造方法注意事项:
      1.如果我们手动给出了构造方法,编译器不会在给我们提供默认的空参数构造方法, 如果我们没写任何的构造方法,编译器提供给我们一个空参数构造方法

      1. 在构造方法中,默认的第一条语句为 super();
        它是用来访问父类中的空参数构造方法,进行父类成员的初始化操作
      2. 当父类中没有空参数构造方法的时候,怎么办?
        a: 通过 super(参数) 访问父类有参数的构造方法
        b: 通过 this(参数) 访问本类中其他构造方法
        注意:[本类中的其他构造方法已经能够正常访问父类构造方法]
      3. super(参数) 与 this(参数) 不能同时在构造方法中存在
    11 final&static关键字的特点
    • final&static关键字的特点
      • final修饰的类不可以被继承,但是可以继承别的类
      • final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加fina
      • final修饰的变量称为常量,这些变量只能赋值一次。
      • 引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改
      • 修饰成员变量,需要在创建对象前赋值,否则报错。可以在创建对象时所调用的构造方法中,为变量n赋值* static关键字的特点
      • 被static修饰的成员变量属于类,不属于这个类的某个对象
      • 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
      • 同一个类中,静态成员只能访问静态成员
      • 多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量
      • main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中
    匿名对象与内部类

    匿名对象的特点:

    • 创建匿名对象直接使用,没有变量名
    • 匿名对象在没有指定其引用变量时,只能使用一次。
    • 匿名对象可以作为方法接收的参数、方法返回值使用

    内部类的分类

    • 成员内部类
    class 外部类 { 
        修饰符 class 内部类 {
            //其他代码
          }
    }
    
    • 局部内部类
    class 外部类 { 
        修饰符 返回值类型 方法名(参数) {
                class 内部类 {
                    //其他代码
                 }
          }
    }
    
    

    匿名内部类作用:匿名内部类是创建某个类型子类对象的快捷方式

    //已经存在的父类:
    public abstract class Person{
        public abstract void eat();
    }
    //定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
    Person  p = new Person(){
        public void eat() {
            System.out.println(“我吃了”);
    }
    };
    //调用eat方法
    p.eat();
    //匿名内部类的实现
    //前提:必须有继承或者接口,new的不是子类而是父类或者接口
    new 父类或接口(){
        //进行方法重写
    };
    
    访问修饰符和代码块

    修饰符: 编写的类、方法、成员变量的权限访问

    • 要想仅能在本类中访问使用private修饰;
    • 要想本包中的类都可以访问不加修饰符即可;
    • 要想本包中的类与其他包中的子类可以访问使用protected修饰
    • 要想所有包中的所有类都可以访问使用public修饰。
    • 注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

    代码块分类:局部代码块,构造代码块,静态代码块

    局部代码块是定义在方法或语句中
    class Demo{
        public static void main(String[] args)  {
            {
                     int x = 1;
                     System.out.println("普通代码块" + x);
            }
            int x = 99;
            System.out.println("代码块之外" + x);
        }
    }
    
    构造代码块是定义在类中成员位置的代码块
    1. 优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
    2. 每创建一个对象均会执行一次构造代码块。
    public class Person {
        private String name;
        private int age;
        
         //构造代码块
        {
            System.out.println("构造代码块执行了");
        }
        Person(){
            System.out.println("Person无参数的构造函数执行");
        }
    }
    
    静态代码块是定义在成员位置,使用static修饰的代码块。
    1. 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
    2. 该类不管创建多少对象,静态代码块只执行一次。
    3. 可用于给静态变量赋值,用来给类进行初始化。
    public class Person {
        private String name;
        private int age;
         //静态代码块
        static{
            System.out.println("静态代码块执行了");
        }
    }
    

    上一篇:Java基础笔记——环境搭建&变量
    下一篇:Java常用API

    相关文章

      网友评论

          本文标题:[Java基础] 类,对象,多态,继承笔记

          本文链接:https://www.haomeiwen.com/subject/rniifftx.html