Java面向对象-多态-包和导包-权限修饰符-final

26 篇文章 0 订阅
12 篇文章 0 订阅

目录

一、多态

1.1.为什么要使用多态?

1.2.多态的表现形式

1.3.多态的前提

1.4.多态的调用

1.4.1.调用变量

1.4.2.调用方法

1.5.多态的注意事项

二、包和导包

2.1.包

2.1.1.包的使用

2.1.2.包的作用

2.2.导包

2.2.1.什么时候不需要导包?

2.2.2.导包的使用

2.2.3.导包方式

2.2.4.总结

三、权限修饰符

3.1.权限修饰符的分类

3.1.1.pubilc

3.1.2.protected

3.1.3.default

3.1.4.private

3.1.5.注意事项

3.1.6.修饰符总结表格

3.2.权限修饰符的使用

3.2.1.父类自己创建对象

3.2.2.子类创建对象

四、final修饰符

4.1.final的使用

4.1.1.常量(变量)语法

4.1.2.方法语法

4.2.final的注意事项


一、多态

        一种事物的多种形态|多种表现形式【行为多态】

1.1.为什么要使用多态?

        当父类想要使用子类中重写的方法的时候,就可以使用多态来进行。

1.2.多态的表现形式

        父类的引用指向子类类型的对象

Animal an = new Dog();

        在此例中,new关键字创建了一个Dog类的实例,将其赋值给了一个Animal类的变量。

        在正常的赋值中,都是定义什么数据类型的变量,则给这个变量赋值就赋什么类型的值
        多态则实现了将某个数据类型的值赋值给其他数据类型的变量,这个其他数据类型必须是值得父类类型

1.3.多态的前提

        前面已经说过了多态的表现形式是有父类有子类的,所以它首先的是继承的关系。
        两者之间是继承之间的关系
        我们也可以把一个接口看作一个父类,此时我们的接口和子类也可以近似看作是父子关系
        当具备引用的关系的时候,也可以使用多态。

1.4.多态的调用

1.4.1.调用变量

父类中存在的

        直接通过对象名.调用即可
        调用父类中存在的变量,对子类新增内容不可见。
        调用的变量的值是子类中的值

1.4.2.调用方法

重写的方法

        调用子类重写的方法
        使用的是子类重写后的那个方法

非重写的方法

        直接使用父类的那个方法

1.5.多态的注意事项

        1.当多态不配合方法重写使用的时候就没有了意义

二、包和导包

2.1.包

        所谓的包我们可以理解成文件夹的意思,我们可以通过包来对类进行一个分类,甚至是使用同名类。

2.1.1.包的使用

语法:

        package  包名.类名(这里的包名是全限定名)

package com.yjxxt.block02;

        这行代码的意思是,我们所创建的这个java类文件所在的包路径。

2.1.2.包的作用

        1.指定当前类在哪个具体的包下,包是路径的意思
        2.package这个声明的代码必须要在当前类文件的首行
        3.包的主要作用是为了区分类。使得当我们要使用某一个类的时候,可以确切的找到这个类
        4.包还可以帮助我们管理众多的资源

2.2.导包

        当我们要使用到其他包下的类中的一些内容(方法等)的时候,就需要用到导包。

2.2.1.什么时候不需要导包?

        1.使用同一个包下的其它类中的内容
        2.java.lang下的内容

2.2.2.导包的使用

语法:

        import 包名.类名(全限定名)

编写位置:

        package语句的下方,类外

package com.yjxxt.block02;
import java.util.Scanner;
public class Class002_BlockTest {
}

2.2.3.导包方式

方式一:使用包名.类名的方式(全限定名)

语法:

        包名.类名

java.util.Scanner sc = new java.util.Scanner();

         在此例中,java.util是包名Scanner是类名

目的:

        为了使用其他包下的类中的内容。

优点:

        可以使用其他包下的类中想要使用的内容,即使内容的命名是相同的,也是可以做到区分的。
        比如,类A和类B中都有add方法,当我们想要在类C中使用这两个add方法的时候,我们就可以通过这个方式来做到使用时的区分。

缺点:

        只能在当前位置生效一次,是当前位置,不在这个位置,哪怕是同一行语句,也不会生效。
        这样的话,我们如果在这个类中需要多次使用某个方法,就需要在每个用到的地方都通过包名.类名的方式来使用,这样无疑是很麻烦的。
        可不可以尽量简化一下呢?

解决方式:

        使用方式二导包

方式二:使用import关键字来进行导包

语法:

        import 包名.类名(全限定名)

//导入
import java.util.Scanner;
//使用
Scanner sc = new Scanner();

目的:

        方式二让我们在多次使用其他类中某一方法的时候比使用方式一要简单很多

优点:

        1.我们使用方式二的方式引入之后,我们就可以直接通过类名来创建对象了;或是通过类名.方法名来使用我们想要使用的一些方法
        2.方式二对于一些不同类的同名变量是无能为力的,当需要使用到不同类的同名变量的时候,我们需要联合方式一一起使用

缺点一:

        当我们需要使用同一个类中的多个内容时,就需要多次导入同一个类种的不同的内容,这些代码无疑是有很大一部分重复的,我们有没有一种方式,可以让我们只需要导入一次,就可以使用多个不同内容呢?

解决方式:

        使用方式三来导包

缺点二:

        使用方式二还有一个不明显的缺点,就是我们使用方式二的时候,在使用的时候还是需要通过类名.来调用我们想要使用的内容

解决方式:

        使用方式四

方式三:模糊匹配

语法:

        import 包名.类名.*

目的:

        使用模糊匹配可以将想要导入的类下的所有内容都一并导入
        这种方式代表着我们需要把该类中所有的东西都导入;这样我们就可以使用不同的方法而不需要对每个方法都编写导入的代码。

import java.lang.Math.*;

        这就意味着,我们把java.lang包下的Math类中的所有静态内容都导入。

缺点:
        但是这种全部导入的方式,会让我们程序的编译速度减少,运行速度则不受影响。

方式四:静态导入[jdk1.5之后支持]

语法:

        import static 包名.类名.要使用的静态变量名或方法名

目的:

        当我们需要多次使用某个包下某个类种的一个静态的变量或是方法的时候,我们就可以通过这样方式导入,当我们想要调用这个方法或是变量的时候,我们只需要通过变量名就可以使用

import static java.lang.Math.PI;

2.2.4.总结

        1.用String、Math、System的时候,无需导包,java.lang包下的所有类都可以直接使用
        2.全限定名就是包名.类名
        3.当我们在一个类中使用某个类。这个类在不同的包下有定义的时候,我们可以通过导入的方式来明确我们要使用的类;
        4.当我们 在一个类中要同时使用不同包下的同名类的时候,只有一个类是通过导入来明确的,其他的类则需要通过 包名.类名的方式来引入
        5.jdk1.5之后提供了静态导入:import static 包名.类名.属性/方法

三、权限修饰符

        成员修饰符,只能修饰成员,不能修饰非成员内容

3.1.权限修饰符的分类

3.1.1.pubilc

        公共的
        所有的人都可以访问到,是一个公共的,权限最开放

3.1.2.protected

        受保护的
        只能在包内或是通过继承的关系来进行访问

3.1.3.default

        默认的
        只能在包内访问

3.1.4.private

        私有的
        只能在当前类中访问

3.1.5.注意事项

        在这四个修饰符中,能修饰种类的只有pubilc和default两种。

3.1.6.修饰符总结表格

3.2.权限修饰符的使用

3.2.1.父类自己创建对象

本类

        在本类中,通过父类实例化创建的对象,所有修饰符修饰的内容都允许访问

同包不同类

        在同包下,通过父类实例化创建的对象,只有private修饰符修饰的内容不允许访问

不同包

        在不同包下,通过父类实例化的对象,只有pubilc修饰的内容允许访问

3.2.2.子类创建对象

同包

        在同包下,通过子类实例化的对象,只有private修饰符修饰的内容不允许访问

不同包

        在不同包下,通过子类实例化的对象,只有pubilc和protected修饰的内容允许访问

四、final修饰符

        final:最终的、成员修饰符
        从final修饰符的含义我们就可以看出,被final修饰符修饰的内容是不可更改的。
注意:
        这里的不可更改的意思是,当一个final修饰的内容在被初始化后,不可更改。
        当一个内容被初始化后,他在内存中的指向就被固定了下来,此时更改这块内存中保存的值是可以的。就像我们最终指向的是一个对象,改变对象中的值,并不会让这个对象本身所在的内存地址发生改变,对于final修饰的变量而言,它所指向的内存地址是没有变化的。

4.1.final的使用

        final是一个修饰符,他被用来修饰变量或方法

4.1.1.常量(变量)语法

声明

        final 数据类型 常量名;

final int I;

初始化

        变量名 = 字面值;

I = 10;

4.1.2.方法语法

        final {void|数据类型} 方法名(参数列表) {}

final void add() {

}

4.2.final的注意事项

        1.final是可以用来修饰变量的,被final修饰的变量是常量。
        这里的变量包括局部变量、类变量、实例变量。
        2.被final修饰的方法不能被重写
        3.被final修饰的类不能被继承【太监类】

五、引用数据类型的类型转换

5.1.向上转型

        子类转换成父类

        我们可以看成是多态

Father f = new Son();

5.2.向下转型

        父类转换成子类

        向下转型一般配合instanceof使用

        在多态的情况下,我们对子类中新增的内容是不可见的,但是如果我们想要使用子类中的内容的时候,我们就可以通过向下转型来实现
        本质上,多态是将一个子类对象让父类的对象名来引用,也就是说,这个父类对象名的引用实际上是一个子类对象的内存地址,当我们使用了强转将其转换成子类的时候,只是将其变为了原本的数据类型罢了(使得原本不可见的内容可见)。

Son s = (Son) f;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值