Java之面对对象编程

面对对象编程

一、 包

包:是组织类的一种方式,就是一个文件夹,用package 关键字来表示

导入包中的类
public class Test {
     public static void main (String[ ] args) {
           java.util.Date date = new  java.util.Date( );
           System.out.println(date.getTime( ));              }
} 
     

上述方式较为复杂,可以使用import语句导入包
import java.util.* ; 导入java.util下的所有类
java.lang.* ; 由编译器自动导入
但是在实际使用中,还是建议显示指定要导入的类名。


例如:import java.util.* ;
import java.sql.*;
若在代码中定义Date这样的类,编译就会出错,因为util和sql中都存在Date类,无法判断到底是哪一个!


将类放到包中
  • 在.java文件的最上方加上一个package 语句指定该代码在哪个包中
  • IDEA中创建包的方法:src-New- package
  • 包的命名规则:全小写,倒着起 (com.bit.www)
    若在命令行下使用jdk运行包中的程序
    (运行放在com包下的bit文件夹下的TestDemo程序)
    1.编译:使用 javac com\bit\TestDemo.java
    2.运行:使用 java com.bit.TestDemo
  • 在包下的 .java文件需要加入 package com.bit.TestDemo;
    这取决于JVM的启动路径,若在文件所在位置启动JVM,则不需要加。

二、 访问权限

public:公有
private:私有
protected:保护
default:包访问权限
权限大小:public > protected > default > private
若在代码中未加public 等关键字,则默认为包访问权限
在这里插入图片描述

三、继承

继承是一个 is - a 的关系,子类继承父类,用extends 关键字来指定父类
目的:实现代码的复用
被继承的叫做父类,也称超类、基类
继承的叫做子类,也称派生类

子类继承父类,继承了父类除构造方法外的其他东西

子类的构造首先需要构造父类
可以使用super来调用父类的构造方法,帮助父类进行构造

  • 在java中,只能进行单继承,不能进行多继承,即一个子类只能继承一个父类
  • 对于父类的private 属性,子类无法访问
  • 一般将父类的属性设为protected,子类中可以访问,同一个包中也可访问

四、 super 关键字

1.调用父类的方法 super.func( )
2.调用父类的属性 super.data;
3.调用父类的构造方法 super( );

  • 调用父类的构造方法时,只能放在方法的第一行
    super和this的对比:
    在这里插入图片描述

五、代码块的执行顺序

  1. 父类静态代码块
  2. 子类静态代码块
  3. 父类实例代码块
  4. 父类构造代码块
  5. 子类实例代码块
  6. 子类构造代码块
  • 静态代码块只执行一次!
  • invokespecial 构造方法
    invokevirtual 普通实例方法
    invokestatic 静态方法

六、 多重继承/多层继承

子类可进一步派生出新的子类
例如:类B继承了类A,那么类C也可以继承类B

七、final关键字修饰类

被final所修饰的类为密封类,不能被继承
若不想类被继承,可在前面加上final关键字

八、多态

多态:(程序层次上)父类引用子类的对象,并且父类和子类有同名的覆盖方法。这个时候如果通过父类引用调用这个重名的方法,就会发生动态绑定。

使用多态的好处:
1.降低代码的复杂度及调用成本
2.可扩展能力强

多态发生的前提:子类引用父类对象
动态绑定:使用javap -c查看,编译时底层调用父类的方法
运行时,变为子类的方法

要发生动态绑定:
1.父类引用子类的对象
2.子类和父类由同名的覆盖方法

运行时多态:运行时子类和父类同名的方法的地址会覆盖原父类方法的地址


方法表是一个对象一张还是一个类型一张?
一个类型有一张方法表
class对象和方法表和类型一一对应


向上转型

定义:父类引用子类的对象,将子类的对象给父类
发生时机:
1.传值
2.传参
3.方法的返回值

重写

重写:方法名相同,返回值不同,参数列表相同,并且不在一个类中
( 返回值可以不同,但是返回值之间必须构成协变类型)

static方法不支持重写
private方法不支持重写
子类重写父类的方法:子类的权限一定要大于父类的权限

向下转型

定义:将父类的对象给子类
前提:必须先发生一次向上转型,向下转型的类型必须是父类的一个实例

例如:加入 if (animal instanceof Cat ) (Cat是animal的一个实例)

九、抽象类

  1. 抽象方法:没有实现的方法, 用abstract修饰
  2. 包含抽象方法的类叫做抽象类
  3. 抽象类可以包含抽象方法,也可以包含非抽象方法
  4. 抽象类无法实例化一个对象
  5. 一个普通类 若继承了抽象类,一定要重写抽象类中的抽象方法
  6. 抽象类可以继承抽象类,这样就不需要重写抽象方法
  7. 若一个普通类C继承了上述的抽象类,如果上述抽象类A并没有重写抽象类B的抽象方法,那么当前的普通类C一定要重写
  8. 抽象方法不能是private
  9. 抽象类不能被final所修饰,抽象类是为了实现继承
  10. 抽象类可以发生向上转型,创建子类对象

抽象类和普通类的区别:
在这里插入图片描述

十、接口

目的:为了实现多继承
以关键字interface来定义接口,接口命名时尽量以动词命名。
定义接口:

interface IShape {
      public static final int a = 10;
      public abstract void draw();
      

接口中的变量一定要初始化
接口中方法一定不能有具体的实现,都是抽象方法

  • 接口中,void draw() 默认为public abstract void draw();
  • int a =10-> 默认public static final int a =10;

普通类不能继承接口,但是可以实现implems,需要重写接口中的方法

接口不可以实例化,但是可以发生向上转型
一个类可以实现多个接口(implements A接口,B接口)

一个类可以先继承,再实现接口(继承在先,接口在后)
抽象类是可以实现接口的,但普通类B要继承这个抽象类A,这时需要重写接口的方法

接口与接口之间是不能发生实现的,但是它们之间可以继承,一个接口可以继承多个接口

抽象类和接口的区别:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值