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

2018-03-11  本文已影响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的形式明确要调用的构造方法。

注意事项:

11 final&static关键字的特点
匿名对象与内部类

匿名对象的特点:

内部类的分类

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 父类或接口(){
    //进行方法重写
};
访问修饰符和代码块

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

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

局部代码块是定义在方法或语句中
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

上一篇 下一篇

猜你喜欢

热点阅读