本篇文章的内容是从包开始到接口部分,适合Java初学者进行学习和复习。
在进行面向对象编程学习之前,需要先了解访问修饰符
访问修饰符
访问修饰符权限从小到大
private(私有,当前类的内部可见) 创建包的时候,如果在命名中用”.”分割,每个"."代表创建一个子文件夹 如果使用a.b.c进行命名。意思就是创建一个文件夹a,然后在a里面创建一个b文件夹,然后在b里面创建一个c文件夹 使用方法:import 包名.类名 注意!import只能导入类!!! import可以导入包中的某个具体的类 特殊用法 import 包名.* 意思是导入包下的所有类,按需加载。 但是”.*“用法在导入中容易出现导入两个同名类,引发报错,可以采用下列两种方式进行改正: import static 静态导入 只会导入所有静态类,从而快速访问其中的静态方法和属性 在调用的时候就不用加类名了 比如System.out.println()打印方法,就不用加System.了 java.lang JDK的基础包(System、String、Object类都在这个包下,JDK1.1之后会自动导入) java,lang.reflect 反射开发包 java.util 工具包(集合类都在这个包下,Arrays、LinkedList、HashMap等等) java.io I/O开发包,文件读取和写入 java.net 网络编程开发包 java.sql 数据库开发用到的包 当类和类之间满足一个类is a另一个类 那么一定存在继承关系,这种继承关系被称为天然继承。 定义类的时候如果使用extends 即public class 类1 extends 类2 {} 则类1继承了类2的所有方法和属性 类1称为子类/派生类 类2称为父类/基类 注意事项: 使用继承的时候还要考虑到现实逻辑等因素,来确定是否真的能继承。不符合现实和逻辑的两个类在实际中不应该存在继承关系 另外虽然不能多重继承,但是允许多层继承(A继承了B,允许C继承A)。满足继承关系的类之间的关系是垂直的,不是并列的。 通过private访问权限修饰符修饰的方法和属性如果被继承,称为隐式继承。在子类中不能直接访问和调用从父类那里继承过来的属性和方法,只能通过get和set方法来进行调用 注意事项: 1.静态方法和属性继承后可以直接使用 2.protected修饰的类如果在不同包中,必须通过继承才能访问,即便继承了也只能在父类和子类中才能用 3.protected修饰的类如果在同一包(同一包的子包也不行)中,则无需继承也可见,因为protected的公开性要大于default(包权限) 修饰属性(直接从当前类中找同名属性)、修饰方法、表示当前对象的使用 当有继承关系的时候,默认从当前类中寻找同名属性,如果找不到就去父类中寻找 super 不能表示父类对象的引用,就是不能直接用super来访问父类的地址(这里是与this的不同) 修饰属性,表示直接从父类中寻找同名属性 修饰方法,表示直接从父类中寻找同名方法 父类找不到,就去父类的父类找 隐式继承是找到了用不了,不是没找到,并不会再向上找 注意事项: 1.当调用无参构造产生子类对象之前,要先调用父类的构造方法产生父类对象然后才能进行子类的构造方法(没有你爸,何来的你?) 2.当父类还有父类的时候,就会再产生父类的父类,往上诸如此类 super修饰构造方法 1.如果子类继承父类,父类里面有有参构造,所以子类的构造方法里面首行必须super(参数)显式调用一下父类的有参构造(无论子类里面是不是有参,父类有参我就得显式调用)。但是如果父类是无参构造,就无所谓了,因为无参构造是JVM默认加的。 2.this调用本类和super调用父类有参构造的时候都得放在自己类的构造方法首行,但只有一个首行,所以这个时候就得考虑取舍了,取舍于你到底要调谁 super修饰普通方法 直接从父类寻找方法,跳过本类 final关键字的新用法 final修饰属性,表示属性的值定义后不能变,即常量 final修饰类,表示类无法被继承 类与类之间的关系不仅有继承还有组合 比如School类里面有Student类和Teacher类,School类由Student类和Teacher类组合而成 定义:一个引用可以表现出多种行为/特性 正常创建对象:Dog dog =new Dog() 类名称 类引用 =new 该类对象 多态的向上转型: Animal animal = new Dog() 父类 父类引用= new 子类对象 向上转型发生在继承关系的类之间,不管是不是直接父类 父类 父类引用= new 子类实例 向上转型的一般意义: 向上转型可以在定义方法的时候只用定义一个最顶层的父类,就可以在主方法中通过调用方法指向所有子类对象 同一个类中定义了若干个方法名称相同,参数列表不同的一组方法。 发生在有继承关系的类之间,子类定义了和父类除了权限不同(子类权限必须大于等于父类权限,private权限不包含在内,给你隐藏了拿啥比去),其他全部相同(内容可以不同,比如System.out.println())的方法,这样的一组方法称之为方法重写。 注意! 1.若子类没有重写方法,则向上搜寻父类,谁重写了就用谁的,就近原则。 2.不用去看类定义的前半部分,就看通过哪个类new的对象(比如A a=new B(),不看"="前面的,就看后面的,是通过B类new的对象),只要new的这个对象的类中覆写了同名方法,则调用的一定是覆写后的方法。 3.static修饰的方法不能重写,因为static与对象无关,重写是有对象才能重写的。 4.方法重写必须发生在返回类型严格相同的方法上,但是有继承关系(只能是向上转型(子类覆写父类),向下转型还是不行)的返回类型不同的方法是例外。比如子类继承父类,父类不能覆写子类。因为父类is not a子类(向下转型),但是子类is a 父类(向上转型) 方法重写发生在三种情况 1.类名称 引用名称=new 类实例() 引用名称.方法名称() 能通过”.”来访问的方法必须都在类名称中定义了,至于这个方法会表现出来什么样子,看的是实例所在的方法。 2.如果A类中没定义一个方法,比如A a=new B() B中有fun(),A没有,B继承了A,a.fun访问不到 综上:到底能“.”哪些方法“=”前面说了算,“.”之后方法长啥样new之后说了算 子类名称 子类引用=(子类名称) 父类引用 向上转型 Animal animal=new Dog() 披着狗皮的Animal 向下转型 Dog dog=(Dog) animal 向下转型后怎么再转回去 Animal animal2=dog 为啥要向下转型? 答:举个例子,小明是人,人是动物的子类。动物具备吃和睡的方法,但写代码并不是动物类里面具备的,是人类里面具备的。所以你要调用写代码这个方法就得把animal再强转到person这个类上去。 向下转型的前提条件 必须具备向上转型,就是得有Animal animal=new Dog(),才能有Dog dog=(Dog) animal。没有向上转型,animal引用与Dog类毫无关系,你向下转个寂寞 instanceof关键字可以规避向下转型的异常。 引用名称 instanceof 类 会返回一个boolean值就是true 或者 false 帮助我们进行判断是否转型成功 子类继承父类 父类中定义一个属性 子类中可以通过this,super,或者不加任何关键字 访问这个属性,也可以创建一个对象来访问。但是这个对象只能是子类的对象,不能是父类的对象。 不过在实践中只用this 和super即可,其他的没啥意义 若需要强制要求子类覆写方法,就会用到抽象类 定义:抽象类是普通类的”超集”,只是比普通类多写了一些抽象方法而已,抽象方法所在的类必须是抽象类,子类若继承了抽象类,必须覆写所有抽象方法(前提子类必须是普通类) Java定义抽象类或者抽象方法用到abstract关键字 使用关键字abstract声明,只有方法声明没有方法体{}。抽象方法在本类中没有具体实现,延迟到子类去实现 Java中没有方法体的方法不一定就是抽象方法,还有本地方法 若一个类是抽象类,不管他有没有抽象方法,这个类本身就是一个抽象的概念,没法具体到某个特定的实例,就是不能直接通过该类实例化对象。只能通过子类向上转型变为抽象父类的引用 Person加了abstract Person per=new Person() 报错 Person per=new China() 通过 注意!!! 1.子类是普通类,父类是抽象类 子类必须覆写所有抽象父类的所有抽象方法,但是如果子类的父类已经覆写了父类的父类的抽象方法,那子类就不用写了。类似于父债子偿,你总得有一个类去覆写抽象类的方法,父类不写,你就子类都写了。 2.子类是抽象类,父类是抽象类 子类可以写也可以不写父类的抽象方法 3,抽象类存在构造方法,并且子类在实例化的时候仍然满足继承原则 4.另外还要注意继承的时候创建子类对象要先有父类对象,然后有方法重写就去子类里面找方法重写,进行到这里还没有调用子类构造方法进行赋值,所以任何属性都是默认值。进行完对象创建,构造方法就赋值完了。 (接口这个类只能向上转型来创建对象 接口父类 接口父类引用=new 子类实例() ) 接口由全局常量(1%会用)和抽象方法(99%几乎都是)构成,使用interface声明接口,子类使用implements 接口类来实现接口,必须覆写接口所有的抽象方法 有了接口这个类,就可以向上转型作为参数来去兼容所有的接口类子类对象。如果没有接口,子类之间没有任何关系,无法兼容 定义一个接口,然后定义它的子类。在Test方法中定义一个(静态)方法A,方法A的方法体是接口类的成员方法,参数是接口类参数,这样在主方法中就可以创建子类的实例化对象,并且通过调用方法A,参数是子类参数,就可以实现子类功能 比如接口Swim,接口Run,接口Fly 对于人这个子类,就会Swim和Run,可以在子类创建的时候implements Run,Fly。 阿里编码规范: 接口中的抽象方法不用写public abstract,全局常量也不用写static final面向对象编程
包
import关键字
常见的系统包
继承
extends关键字
继承的使用条件:
隐式继承
this与super
this
super
final
多态(推荐学习:UML类图)
方法重载与方法重写
方法重载(overload)
方法重写(override)
方法重写的深入理解
向下转型
instanof关键字
抽象类
抽象方法
接口
接口 的意义
接口表示规范
接口表示能力(可以被子类多继承)



