Java 三大特性学习笔记(基础)

目录

约定俗成的运算符(铺垫)

1.逻辑运算中的:&和&&,|和||

一个符号 & | 和两个符号 && || 的区别是 :

2.位(bit)运算中的:&和|

第一个特性:封装性

封装修饰符介绍:以下封装等级由低写到高

1.public 公开等级(相当于没有封装)

2.protected 受保护等级 (特殊的封装等级)

3.“缺省” 默认等级(即不加封装修饰符,让其留空)

4.private 私有等级(最高的封装等级)

第二个特性:继承

A:this 关键字(本类的引用)

继承之后的属性

B:super 关键字(父类的引用)

1.继承之后的成员方法

2.继承之后的构造方法 *

注意:父类可以接受子类参数,但子类接受父类参数就需要先进行强制类型转换。

比较:this 和 super        (由于特性而应运而生的关键字)

第三个特性:多态(我叫它分化)


前言:首先这里不会写Java的初级语法,只是会写Java的简单特性和一些扩展。我们可以先游览一下常见的DOS命令:(如何使用DOS命令呢?win键 + R键打开运行框,再输入 cmd 回车打开控制台接着输入即可)

*:                                      选择盘符,如C:


dir                                     展示文件夹里的文件目录


cd xxx                               进入名为 xxx 的文件夹


cd ..                                  返回上一级文件夹


md xxx                             创建一个名为 xxx 的文件夹


rd xxx                               删除一个名为 xxx 的文件夹(里面需为空)


del xxx.扩展名                  删除 xxx 文件


cd\ 或 cd/                          回到盘符目录

约定俗成的运算符(铺垫)

像 + 和 - 都是已经约定俗成的运算符(数学运算符)了,在计算机里也有一些运算符,让我们来认识它们吧!

三元运算符(if...else的简化版)

如果true则返回前者,反之后者

(布尔表达式)?返回值1:返回值2

1.逻辑运算中的:&和&&,|和||

首先,在java中,它们都是逻辑运算。

& 和 && 都是 ‘与’ 运算,代表其两边只要有一个表达式为false;则最终结果为false。

| 和 || 都是 ‘或’ 运算,代表其两边只要有一个表达式为true,则最终结果为true。

一个符号 & | 和两个符号 && || 的区别是 :

  1.         & 和 | 是无论左边的表达式结果如何(true/false),右边的表达式也要继续判断。
  2.         && 和 || 是左边的表达式结果已经确定了最终结果的话,右边表达式就不会继续判断,直接跳过得出 = 最终结果

2.位(bit)运算中的:&和|

& 按位与,将两边表达式的值按二进制位展开分为A和B,A、B进行上下对照,其对应的位依次按值进行“与” & 逻辑运算。

| 按位或,将两边表达式的值按二进制位展开分为A和B,A、B进行上下对照,其对应的位依次按值进行“或” | 逻辑运算。

如果位运算两边的表达式数值的位数不同,则较短的数进行高位补0。

还有一些运算符我这里就不赘述了,以后有空再补充。

3.左移和右移运算(基于二进制)

N << a 代表:N 乘于 2 的 a 次方

N >> a 代表:N 除于 2 的 a 次方

无符号右移 >>> “绝对值”的右移

正数负数
左移 <<不论正负数,都是低位补0
右移 >> (即补符号位)高位补0高位补1
无符号右移 >>>不论正负数,都是高位补0

第一个特性:封装性

        用大白话说:就是将类中的指定信息给隐藏起来,使外部程序不能直接访问此类里的这些信息,但可以通过类中专门定义方法来开放这些信息的操作及访问。(就像一个电视机顶盒,里面的电路板复制构造我们不去接触,因为有风险;而机顶盒只对外开放了几根插头,来方便我们使用机顶盒)

目的:使其他类只能通过操控类中的对象来直接达到目的,不能看到具体的实现和属性,从而提高了程序的安全性便利性。隐藏信息,实现便利控制。

封装修饰符介绍:以下封装等级由低写到高

在Java里,我们使用封装修饰符来确定某些类的信息的封装等级。

1.public 公开等级(相当于没有封装)

        即对所有类保持开放。

2.protected 受保护等级 (特殊的封装等级)

        对同一个包下的类及其子类都保持开放,不可以修饰外部类

3.“缺省” 默认等级(即不加封装修饰符,让其留空)

        仅仅对同一个包下的类保持开放。

4.private 私有等级(最高的封装等级)

        仅在同一个类保持开放,不可以修饰外部类。

第二个特性:继承

        继承概念一般出现在父子之间,所谓“子承父业”即是如此(存在所属关系)。在Java中多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中(可称为它们的父类),那么多个类无需再定义这些属性和行为,只需继承它们的父类即可。(多子类 继承==> 一父类)Java只接受单继承,即一个类最多只能有一个父类。(一个人只能有一个亲生父亲)

父类又称为基类或超类,子类又称为派生类

目的:1.提高代码的复用性(直接继承“家业”)。2.让类和类之间产生了一种所属或兄弟关系,这为后面的多态性的出现埋下了伏笔。

A:this 关键字(本类的引用)

意义:特指当前类的对象的引用。(就像打 110 电话,无论你在哪个地方打 110 都会自动转接到当地离你最近的公安局里)

继承之后的属性

        当一个类继承了一个类之后,它父类的属性对它自己存在什么影响呢?首先从属性名字定义上入手。

若父类和子类的属性未出现重名则日常使用是没有一点影响。(互不干涉)
若父类和子类的属性出现重名则需要用 this 区分。(this 属性代表本类里的)
若父类的属性进行了封装就算是子类也不能绕过封装等级直接去访问其属性。

B:super 关键字(父类的引用)

意义:专门指向父类的引用。(就像学生遇到难题就去问老师一样)

1.继承之后的成员方法

        父类的成员方法又会对其子类造成什么影响呢?再从其名字来入手吧!

成员方法未出现重名无影响
成员方法出现了重名子类重写此成员方法 或者 子类需要用 super 区别(super 代表父类的)

2.继承之后的构造方法 *

        父类的构造方法会影响到其子类,但是构造方法的名字是与类名绑定的,所以子类是无法直接使用其父类的构造方法的。(它们类名都不一样啦!)

        构造方法的作用是初始化属性并完成创建对象的操作,但是子类执行构造方法来初始化自己的时候,也必须执行其父类的初始化。(所以子类的构造方法中会默认在第一行代码中添加 super(); 代表初始化父类的操作,而父类初始化完成后再让子类使用/初始化)

这里要强调的是,不管你的子类写不写 super(); 它都会默认帮你加上这句代码在第一行里,代表调用父类的空参构造方法,想要指定父类的某个有参构造方法就必须自己写。(依然在子类构造方法的第一行!)

注意:父类可以接受子类参数,但子类接受父类参数就需要先进行强制类型转换。

        比如:我需要一些水果,无论是苹果还是葡萄都可以;但是如果我指定需要苹果,那你给葡萄我就不接受,除非你先用葡萄换了苹果再说。

比较:this 和 super        (由于特性而应运而生的关键字)

理解它们之前,先告知一点:父类空间先于子类对象的产生。(即先初始化父类空间,再用子类空间包裹起来成为子类对象)在没有封装的影响下,子类是可以随便使用其父类成员的。

第三个特性:多态(我叫它分化)

意义:与继承一起提高了代码的可维护性以及扩展性,降低代码耦合度。(前提:必须有父子继承/实现关系)描述了类的多种形态,比如:一个哺乳动物既可能是狗,又可能是猫。根据实际需求我们要“哺乳动物”转化成不同形态:当我们需要“门卫”时,就希望它是狗,当我们需要抓老鼠时,就希望它是猫。

        比如:柴犬是犬类,也是哺乳动物。

Java代码 display (当我们要一个主人去用一个方法来喂养不同的生物时,就可以利用多态性)

public class Owner_DogCat {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
//  以上分别创建了狗 dog和猫 cat两个不同的生物
        Owner owner = new Owner();
//  创建它们的父类——主人 owner
        owner.feed(dog);
        owner.feed(cat);
//  一个主人 owner用同一个方法 feed()可以喂养不同的生物,这就是多态的体现!
//  由于继承关系的存在,父类对子类有包容性,这出现了一类分化的多态体现!      
    }
}
class Owner {
    public void feed(Animal a) {
        a.eat();
    //同名的eat方法,具体实施利用了多态分化(看具体实例/子类参数)
    }
}
class Animal {
    public void eat() {
    //父类的原始方法eat,容忍了子类的eat方法的存在,即接受子类参数的传递
        System.out.println("哺乳动物的进食本能...");
    }
}
class Dog extends Animal {
    @Override
    public void eat() {
    //分化的eat方法
        System.out.println("狗吃骨头中...");
    }
}
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼中...");
    }
}

这个多态性使Java的类与类的关系更加系统立体了,让Java代码更加的灵活多变!显然进步很大哦!

扩展:向上转型、向下转型和静态绑定、动态绑定

向上转型:简单说就是把一个子类的实例赋值给其父类的引用

向下转型:即把父类的实例强制赋值给其子类的引用

由于多态而产生的静态/动态绑定
静态绑定动态绑定
触发/有效时期编译时触发(代表能早知道代码的错误)运行时触发(代码错误只在运行时暴露出来)
作用于?使用 private / static / final 修饰的变量或方法(因为它们比较稳定,不可被继承或继承后无法重写)可以被子类重写的方法
借助于?类信息对象信息
例子
重载(Overload)的方法用静态绑定完成
重写(Override)的方法使用动态绑定完成
若父子类存在声明一样的属性/方法只调用其子类的,而隐藏父类的(这不是屏蔽,子类仍可以指定访问父类的属性/方法)将调用对象实际类型所限定的方法
假设

当指定调用的属性/方法,而编译类型里没有时就回溯到它的父类去找,若顶级父类也没有的话就抛出异常。

(我们的祖宗早为我们提供了一套拉屎方法,所以当我们想拉屎时就直接回溯调用此方法即可,我们就不必再创建新的拉屎方法了。这是父类回溯的比喻)

当调用对象属性时会转为静态绑定性质。而调用对象方法时,该方法会和该对象的内存地址、运行类型绑定。

(当我们想打仗时,不会再调用老的冷兵器打仗方法而是调用新的热兵器打仗方法。根据实际情况来决定具体执行的方法)

总结
静态绑定机制通过隐藏和父类回溯可以提升代码复用性,提高程序运行效率
多态是设计模式的基础,而由此而生的动态绑定机制能够降低代码耦合性

        另外欢迎大家在评论区讨论哦!接下来可以看看我的代码块学习笔记:

Java代码块学习笔记(基础)_忌冬的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值