栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java面向对象编程入门

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java面向对象编程入门

本篇文章的内容是从包开始到接口部分,适合Java初学者进行学习和复习。

在进行面向对象编程学习之前,需要先了解访问修饰符

访问修饰符

访问修饰符权限从小到大

private(私有,当前类的内部可见)

面向对象编程

创建包的时候,如果在命名中用”.”分割,每个"."代表创建一个子文件夹

如果使用a.b.c进行命名。意思就是创建一个文件夹a,然后在a里面创建一个b文件夹,然后在b里面创建一个c文件夹

import关键字

使用方法:import 包名.类名

注意!import只能导入类!!!

import可以导入包中的某个具体的类

特殊用法

import 包名.*

意思是导入包下的所有类,按需加载。

但是”.*“用法在导入中容易出现导入两个同名类,引发报错,可以采用下列两种方式进行改正:

  1. 使用import的时候将要用的类写明确。
  2. 在使用类的时候写全名

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关键字

定义类的时候如果使用extends   即public class 类1 extends 类2 {}

则类1继承了类2的所有方法和属性

类1称为子类/派生类

类2称为父类/基类

注意事项:

使用继承的时候还要考虑到现实逻辑等因素,来确定是否真的能继承。不符合现实和逻辑的两个类在实际中不应该存在继承关系

继承的使用条件:
  1. 必须满足类1 is a类2
  2. 一个子类只能使用extends继承一个父类,这点与其他语言中的多重继承是不同的。
  3. 子类会继承父类的所有属性和方法(显式继承:public属性和方法可以直接使用)
  4. 隐式继承:private属性和方法也被继承,但无法直接使用

另外虽然不能多重继承,但是允许多层继承(A继承了B,允许C继承A)。满足继承关系的类之间的关系是垂直的,不是并列的。

隐式继承

通过private访问权限修饰符修饰的方法和属性如果被继承,称为隐式继承。在子类中不能直接访问和调用从父类那里继承过来的属性和方法,只能通过get和set方法来进行调用

注意事项:

1.静态方法和属性继承后可以直接使用

2.protected修饰的类如果在不同包中,必须通过继承才能访问,即便继承了也只能在父类和子类中才能用

3.protected修饰的类如果在同一包(同一包的子包也不行)中,则无需继承也可见,因为protected的公开性要大于default(包权限)

this与super

this

修饰属性(直接从当前类中找同名属性)、修饰方法、表示当前对象的使用

当有继承关系的时候,默认从当前类中寻找同名属性,如果找不到就去父类中寻找

super

super   不能表示父类对象的引用,就是不能直接用super来访问父类的地址(这里是与this的不同)

修饰属性,表示直接从父类中寻找同名属性

修饰方法,表示直接从父类中寻找同名方法

父类找不到,就去父类的父类找

隐式继承是找到了用不了,不是没找到,并不会再向上找

注意事项:

1.当调用无参构造产生子类对象之前,要先调用父类的构造方法产生父类对象然后才能进行子类的构造方法(没有你爸,何来的你?)

2.当父类还有父类的时候,就会再产生父类的父类,往上诸如此类

super修饰构造方法

1.如果子类继承父类,父类里面有有参构造,所以子类的构造方法里面首行必须super(参数)显式调用一下父类的有参构造(无论子类里面是不是有参,父类有参我就得显式调用)。但是如果父类是无参构造,就无所谓了,因为无参构造是JVM默认加的。

2.this调用本类和super调用父类有参构造的时候都得放在自己类的构造方法首行,但只有一个首行,所以这个时候就得考虑取舍了,取舍于你到底要调谁

super修饰普通方法

直接从父类寻找方法,跳过本类

final

final关键字的新用法

final修饰属性,表示属性的值定义后不能变,即常量

final修饰类,表示类无法被继承

类与类之间的关系不仅有继承还有组合

比如School类里面有Student类和Teacher类,School类由Student类和Teacher类组合而成

多态(推荐学习:UML类图)

定义:一个引用可以表现出多种行为/特性

正常创建对象:Dog dog =new Dog()

            类名称 类引用 =new 该类对象

多态的向上转型: Animal animal = new Dog()

             父类  父类引用= new 子类对象

向上转型发生在继承关系的类之间,不管是不是直接父类

父类  父类引用= new 子类实例

向上转型的一般意义:

向上转型可以在定义方法的时候只用定义一个最顶层的父类,就可以在主方法中通过调用方法指向所有子类对象

方法重载与方法重写

方法重载(overload)

同一个类中定义了若干个方法名称相同,参数列表不同的一组方法。

方法重写(override)

发生在有继承关系的类之间,子类定义了和父类除了权限不同(子类权限必须大于等于父类权限,private权限不包含在内,给你隐藏了拿啥比去),其他全部相同(内容可以不同,比如System.out.println())的方法,这样的一组方法称之为方法重写。

注意!

1.若子类没有重写方法,则向上搜寻父类,谁重写了就用谁的,就近原则。

2.不用去看类定义的前半部分,就看通过哪个类new的对象(比如A a=new B(),不看"="前面的,就看后面的,是通过B类new的对象),只要new的这个对象的类中覆写了同名方法,则调用的一定是覆写后的方法。

3.static修饰的方法不能重写,因为static与对象无关,重写是有对象才能重写的。

4.方法重写必须发生在返回类型严格相同的方法上,但是有继承关系(只能是向上转型(子类覆写父类),向下转型还是不行)的返回类型不同的方法是例外。比如子类继承父类,父类不能覆写子类。因为父类is not a子类(向下转型),但是子类is a 父类(向上转型)

方法重写发生在三种情况

  1. 引用赋值 A a=new B() A a2=new B()
  2. 方法传参 fun(a1)、fun(a2)
  3. 方法返回值是子类对象

方法重写的深入理解

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类毫无关系,你向下转个寂寞

instanof关键字

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. 表示具备某种能力/行为。比如Person类具备游泳这种行为,Duck类也具备...
  2. 表示一种规范或者标准。USB接口,5G标准...

接口由全局常量(1%会用)和抽象方法(99%几乎都是)构成,使用interface声明接口,子类使用implements 接口类来实现接口,必须覆写接口所有的抽象方法

接口 的意义

有了接口这个类,就可以向上转型作为参数来去兼容所有的接口类子类对象。如果没有接口,子类之间没有任何关系,无法兼容

接口表示规范

定义一个接口,然后定义它的子类。在Test方法中定义一个(静态)方法A,方法A的方法体是接口类的成员方法,参数是接口类参数,这样在主方法中就可以创建子类的实例化对象,并且通过调用方法A,参数是子类参数,就可以实现子类功能

接口表示能力(可以被子类多继承)

比如接口Swim,接口Run,接口Fly

对于人这个子类,就会Swim和Run,可以在子类创建的时候implements Run,Fly。

阿里编码规范:

接口中的抽象方法不用写public abstract,全局常量也不用写static final

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号