抽象封装继承多态

面向对象三大特征或四大特征都可以.

1.抽象

设计类的过程称为抽象
类是对象的抽象,类是具有相同或相似的特征和行为的对象的抽象

2.封装

使用各种合适的访问限定符修饰属性方法和类
规范:类都是public的,方法都是public的,属性都是private的
属性的访问:构造方法/访问器方法.

  • A:封装概述

    • 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

    • 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。

  • B:封装好处

    • 隐藏实现细节,提供公共的访问方式
    • 提高了代码的复用性
    • 提高安全性。
  • C:封装原则

    • 将不需要对外提供的内容都隐藏起来。
    • 把属性隐藏,提供公共方法对其访问。

3.继承

类和类之间的关系,被继承的类称为父类,继承父类的类称为子类.
父类:超类 基类 元类 祖先类 上层类 <—– (一个意思)
子类:后代类 继承类 <—– (一个意思)
对于父类所有的东西(属性/方法),子类都可以拥有.
本质:
提高类和类之间的代码的复用性.

4.继承的语法

父类语法:

public class A{
}

子类语法:

public class B extends A{
}

注意:
1)extends表示继承,s不能省略
2)java在类层次上只支持单继承—-一个类只能有一个直接父类()
3)父类的属性和方法,子类都拥有,但是不一定能用
–父类的私有属性,子类不能直接访问
4)构造方法不能继承
5)如果子类自定义了和父类重名的属性,会直接覆盖;
重名的方法可能覆盖,可能重载
6)一个类可以有很多子类
7)子类之间的关系是兄弟关系,互不干涉也无法互相继承
8)对于父类的私有属性,子类拥有但是不能直接访问.可以使用继承下来的父类中公有的访问器方法访问.

5.方法的重写(override)

子类方法对于父类方法的覆盖—>子类方法对于父类方法的重新实现—>重写
和重载的区别:
1)重写只能发生在两个类之间,重载可以在一个类内部
2)重写是对父类方法的重新实现,父类方法在子类对象中无法调用,重载是对方法的延伸实现,使得方法更具有多样性
3)重写的方法和原方法的方法名,返回值类型以及参数列表完全一致.重载要求方法名一致,参数列表不一致

注意:
1)子类不重写父类方法,子类对象直接使用父类的方法
2)子类重写父类方法,子类对象使用子类重写之后的方法
3)重写方法的过程中,方法名和参数列表不允许修改,访问限定符的范围允许放大
//只有返回值类型不同的两个方法,会报错,系统不知道指的是哪个.

@Override
方法重写的标志,一般对于重写的方法需要在方法上添加
@Override称为注释(注解),如果不添加也可以,但是不规范

重写的快捷键: alt+s —>Override / Implements
methods—>选择要重写的方法,选择override

6.在子类中调用父类的方法

父类中的方法是普通的方法,该方法的调用需要使用父类的对象进行调用.
我们可以使用super来调用父类的方法.
super类似于this(this表示当前对象的引用),super表示当前对象所继承的父类对象的引用
super负责在子类重写父类方法的时候调用父类的方法.(只有在重写的时候有最后的机会调用父类的这个方法)
super.方法();

7.子类对象的构建过程

第一步,先执行子类的构造方法
第二步,在子类构造方法的第一行跳转到父类的构造方法开始执行
隐式调用super();—代表父类的构造方法
(this();代表当前类的构造方法)
注意:super();只能写在子类构造方法的第一行,也可以不写,但是默认会生成(看不到)
//子类继承了父类的成员变量,但是不能继承父类的构造函数,可以使用super()来解决成员变量赋值的重复代码.
第三步,父类的构造方法执行完毕后,回到子类的构造方法继续执行
第四步,子类的构造方法完成之后,子类的对象构建完毕

**继承的本质:
构建子类对象的过程中完整的执行了父类的构造方法,意味着在此过程中构建了一个父类的对象,在执行子类构造的过程中,父类的对象被拆分,父类的属性和方法拼接成子类的对象.**
(…联想到了很可怕的画面=_=)

8.Object

是Java设计者提供的一个类,它是除了自身之外其他所有类的父类.
如果一个类extends指定了父类,Object是当前类的间接父类;
如果一个类没有指定父类,Object是当前类的直接父类;(类似于爷爷辈的)

9.栈Stack

又被称为”堆栈”,是一个只有一个出入口的容器.
存储的数据从该口进出,先进去的数据后出来,后进去的数据先出来,称为”FILO”/“FOlI”(first
input last output)(就是先进后出/先出后进)结构.
一个出口一个入口,方便管理

10.堆Heap

是一个没有管理者的容量很大的容器(类似于垃圾场/垃圾房)
里面存放的东西杂乱无章,可以知道该容器什么时候会满.

11.堆和堆栈

Java程序在运行的时候在内存中,
Java程序不能直接修改内存,java运行于虚拟机上,虚拟机影响内存.
Java程序在运行的时候依靠jvm在系统内存中划出一片很大的区域600M~1000M.该内存被当前程序中所有的线程共享,称为Java的堆内存
在方法被调用的时候,此时针对每一个方法,jvm生成一个堆栈(栈),又被称为方法栈.在方法调用结束的时候(方法调用结束的标志是return做出返回值/或者运行到方法体的最后一行),方法栈被销毁.方法栈称为java的栈内存.
堆栈结构

12.数据的存储

数据类型的分类:
基本数据类型 byte short int long float double Boolean char
引用数据类型
存放该数据的变量是否允许.操作:允许的是引用数据类型.

基本数据类型:
存放在栈内存中,针对”int a = 12;”而言,”int
a”称为引用,”12”称为值,基本数据类型的引用和值都在栈里面.
引用数据类型:
“int[] arr={1,2,3}”引用部分”int[]
arr”存放在栈里面,”{1,2,3}”数据部分存放在堆里面.我们把堆内存中真实的数据部分所占据的空间在jvm里面的编号存放在”int[]
arr”里面,该编号是一个十进制的数字,我们把这个数字称为hashcode(哈希值).
注意:Java中没有地址的概念,只有jvm编号—>hashcode

13.两种数据类型修改值的情况

场景:
A方法中定义数据,调用B方法把A方法中定义的数据作为该方法的参数对该数据进行修改.
现象:
基本数据类型:B方法中值的修改无效.
引用数据类型:B方法中值的修改有效.

结论:
对于基本数据类型,作为参数的时候传递的并不是数据本身,而是数据的值,称为值传递.
对于引用数据类型,作为参数的时候传递的是数据本身,修改是有效的,称为引用传递.//传得这是地址么
–传递的都是值,只不过引用数据类型存储的是堆中的一个位置????
上述的结论可以辅助记忆,但不是很准确.

//基本数据类型
public class Test01 {
    public static void main(String[] args) {    
        int number = 10;
        add(number);
        System.out.println(number);//10
    }
    public static void add(int number) {
        number = 12;
    }
}
//引用数据类型
public class Test02 {
    public static void main(String[] args) {    
    int arr[] = {10};
    add(arr);
    System.out.println(arr[0]);//12
}
    public static void add(int[] arr) {
        arr[0] = 12;
    }
}

14. 变量的作用域

全局变量:
类的属性称为全局变量,该变量和所有的方法平级,因此可以被所有的方法共享,且无须作为方法的参数传入.
全局变量可以设置初始值,但是一般不设置.
局部变量:
方法内部定义的变量,以及方法参数列表中的参数称为方法的局部变量,专属于该方法,可以通过传参的方式传递给其他方法使用—>值传递和引用传递.

如果在方法内部存在一个和全局变量重名的局部变量,此时全局变量会临时失效,在该方法内部使用的是局部变量的值.

public class Test02 {
    private static int number = 10;
    public static void main(String[] args) {
        int number = 12;
        System.out.println(number);//12
        show();//10
    }
    public static void show() {
        System.out.println(number);
    }
}
  • 成员变量和局部变量的区别:

    • A:在类中的位置不同

      • 成员变量:在类中方法外
      • 局部变量:在方法定义中或者方法声明上
    • B:在内存中的位置不同

      • 成员变量:在堆内存(成员变量属于对象,对象进堆内存)
      • 局部变量:在栈内存(局部变量属于方法,方法进栈内存)
    • C:生命周期不同

      • 成员变量:随着对象的创建而存在,随着对象的消失而消失
      • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
    • D:初始化值不同

      • 成员变量:有默认初始化值
      • 局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
    • 注意事项:

      • 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
      • 基本数据类型变量包括哪些:byte,short,int,long,float,double,boolean,char
      • 引用数据类型变量包括哪些:数组,类,接口,枚举

15.随机数Random

伪随机数,根据种子产生的数

Random rd = new Random();    //种子是纳秒值
int num = rd.nextInt();//取值范围是int的范围
int num = rd.nextInt(10);
//.nextInt(n) 均匀分布int值介于[o,n);    ]

int num2 = rd.nextInt(end-start+1)+start;
//start-end范围内的随机数

Random rd2 = new Random(1000);//指定种子
int a = rd2.nextInt();//每次数都一样

用法很多

辟谣言论

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1)子类只能继承父类所有的非private的属性和方法 错
父类的属性和方法,子类都拥有,但是不一定能用
–父类的私有属性,子类不能直接访问

2)构建子类对象的时候,先执行父类的构造方法 错
3)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX