javas
image-20210911203459071

面向对象💡

面向对象和面向过程的区别

  • 面向过程面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
  • 面向对象面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低

    构造器☕️

    构造方法类似于python中的__init_(),主要作用是完成类对象的初始化工作。
    如果一个类没有声明构造方法,也可以执行。因为即使没有声明,java会默认添加不带参数的构造方法。[在class文件内会自动生成]
    如果自定义添加了类的构造方法,java就不会自动添加了。定义了有参构造器之后一定要默认加一个无参构造。
    构造方法看起来像一个方法,但是与方法不同,构造方法没有返回值,甚至没有void。
    构造方法的特点:
  1. 名字与类名相同。
  2. 没有返回值,但不能用 void 声明构造函数。
  3. 生成类的对象时自动执行,无需调用。

构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

类名 方法 字段

类
类声明的格式,关键字class后面跟类名(每个单词首字母大写,驼峰命名)。类的主体放入大括号中:

  1. class ClassName{
  2. [类主体]
  3. }

public类的定义必须保存在与类名文件相同的文件中,这个限制不适用于非公共类。
字段是变量,可以是基本类型,也可以是引用类型。(首字母小写,驼峰命名)
方法,类似于python中的函数,定义了一个类可以执行的动作。方法包括声明部分和主体部分。声明部分由返回值、方法名和参数列表组成。主体包含操作执行的代码。

  1. 修饰符 返回值类型 方法名(参数类型 参数名){
  2. ...
  3. 方法体
  4. ...
  5. return 返回值;
  6. }

面向对象三大特性

  • 封装
    封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。就好像我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是可以通过遥控器(方法)来控制空调。如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。就好像如果没有空调遥控器,那么我们就无法操控空凋制冷,空调本身就没有意义了(当然现在还有很多其他方法 ,这里只是为了举例子)。
  1. public class Student {
  2. private int id;//id属性私有化
  3. private String name;//name属性私有化
  4. //获取id的方法
  5. public int getId() {
  6. return id;
  7. }
  8. //设置id的方法
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. //获取name的方法
  13. public String getName() {
  14. return name;
  15. }
  16. //设置name的方法
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. }
  • 继承
    继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。
    关于继承如下 3 点请记住:
  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。(以后介绍)。
  • 多态
    多态,顾名思义,表示一个对象具有多种的状态。

值传递还是引用传递

先说结论:java基本类型变量作为实参进行传递时,是值传递,方法内部局部变量的修改不会影响传入的基本类型变量值。

当传递引用变量是,局部变量会引用与传入的引用变量相同的对象。如果更改方法中引用的对象,由于形参和实参指的是同一个内存地址,所以局部变量的改变会影响到实际的对象。

更加详细的讲解参考:https://blog.csdn.net/it_freshman/article/details/90207612?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242

方法重载

  1. 方法名称相同
  2. 方法的参数列表必须不同,返回值不限制。(因为首先执行方法,必须参数不同java才能知道执行哪个方法)
  3. 静态方法也可以重载
  4. 重载是发生在编译时的,因为编译器可以根据参属的类型来选择使用哪个方法。 ``` public class Apple { int sum; String color;

    public Apple(){} public Apple(int sum){}

    public int getApple(int num){

    1. return 1;

    } public String getApple(String color){

    1. return "color";

    } }

  1. ## 命令行参数
  2. 有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。<br />命令行参数是在执行程序时候紧跟在程序名字后面的信息。

public class CommandLine { public static void main(String args[]){ for(int i=0; i<args.length; i++){ System.out.println(“args[“ + i + “]: “ + args[i]); } } }

  1. ```
  2. $ javac CommandLine.java
  3. $ java CommandLine this is a command line 200 -100
  4. args[0]: this
  5. args[1]: is
  6. args[2]: a
  7. args[3]: command
  8. args[4]: line
  9. args[5]: 200
  10. args[6]: -100

内存分析

当程序运行时,系统会为数据分配一些内存空间。这种数据空间在逻辑上氛围两个部分,堆(heap)和栈(stack)。基本类型值在栈中分配,java对象则在堆中。
堆栈、堆、方法区
JAVAJVM的内存可分为3个区:堆(heap)、堆栈(stack)和方法区(method)

  • 堆区:
    提供所有类实例和数组对象存储区域
    jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
  • 栈区:
    每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
    每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  • 方法区:
    又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
    方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
    运行时常量池都分配在 Java 虚拟机的方法区之中

image-20210614155941624

接口和抽象类

  1. 抽象类
    不能new这个抽象类,只能继承
    抽象类中可以写普通方法,但抽象方法必须在抽象类中。
    抽象类的方法必须由字类重写
  1. 接口
    接口就是规范,定义的是一组规则。接口相当于就是对外的一种约定和标准。
    接口不能被实例化,没有构造方法
    implements可以继承多个接口
    必须重写接口中的方法。
    java语言中,接口是由interface关键字来表述的,比如可以像下面这样定一个接口:
  1. // interface 定义接口的关键字
  2. // 抽象的思维
  3. public interface UserService {
  4. // 接口中的所有定义其实都是抽象的 public
  5. public void run();
  6. public abstract void go();
  7. //返回值类型 方法名(参数)
  8. void add();
  9. void delelte();
  10. void update();
  11. void query();
  12. }
  13. public class UserServiceImpl implements UserService{
  14. @Override
  15. public void run() {
  16. }
  17. @Override
  18. public void go() {
  19. }
  20. @Override
  21. public void add() {
  22. }
  23. @Override
  24. public void delelte() {
  25. }
  26. @Override
  27. public void update() {
  28. }
  29. @Override
  30. public void query() {
  31. }
  32. }

this 和super

  • 从本质上讲,this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。
  • Super() this() 分别可以调用父类和当前类的构造方法。但是在调用的构造方法中,他们都必须在第一行。
  • super. this.分别可以调用父类和当前类的属性字段。
  • this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。包括:static 变量,static 方法,static 语句块。

gqqtuB


  1. public class Person {
  2. public void prt(String s) {
  3. System.out.println(s);
  4. }
  5. Person() {
  6. prt("父类·无参数构造方法: "+"A Person.");
  7. }//构造方法(1)
  8. Person(String name) {
  9. prt("父类·含一个参数的构造方法: "+"A person's name is " + name);
  10. }//构造方法(2)
  11. }
  1. public class Chinese extends Person {
  2. Chinese() {
  3. super(); // 调用父类构造方法(1)
  4. prt("子类·调用父类无参数构造方法: "+"A chinese coder.");
  5. }
  6. Chinese(String name) {
  7. super(name);// 调用父类具有相同形参的构造方法(2)
  8. prt("子类·调用父类含一个参数的构造方法: "+"his name is " + name);
  9. }
  10. Chinese(String name, int age) {
  11. this(name);// 调用具有相同形参的构造方法(3)
  12. prt("子类:调用子类具有相同形参的构造方法:his age is " + age);
  13. }
  14. public static void main(String[] args) {
  15. Chinese cn = new Chinese();
  16. cn = new Chinese("codersai");
  17. cn = new Chinese("codersai", 18);
  18. }
  19. }
  1. 父类·无参数构造方法: A Person.
  2. 子类·调用父类无参数构造方法: A chinese coder.
  3. 父类·含一个参数的构造方法: A person's name is codersai
  4. 子类·调用父类含一个参数的构造方法: his name is codersai
  5. 父类·含一个参数的构造方法: A person's name is codersai
  6. 子类·调用父类含一个参数的构造方法: his name is codersai
  7. 子类:调用子类具有相同形参的构造方法:his age is 18
  8. Process finished with exit code 0

instanceof

判断类之间的关系,是否存在父子关系。

static

static修饰符,用于修饰类的成员方法,类的成员变量,另外可以编写static代码块。
static修饰变量和方法,方便在没有创建对象的情况下进行调用。很显然,被static关键字修饰的方法和变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名进行访问。

  1. static修饰成员方法
    static修饰的方法一般被称作静态方法,无需创建对象,通过类名就可以访问。我们的main方法就是static方法。
  1. static修饰成员变量
    static修饰的成员变量也称为静态变量,静态变量和非静态变量的区别是:静态变量当且仅当类初次加载时就会被初始化。而非静态变量是对象所拥有的,在创建对时才会被初始化。
  1. static修饰代码块
    static还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。
    static块可以放置在类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行。只会在类初次被加载的时候执行一次。

static关键字的误区

  1. Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected这几个关键字。
  2. 虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态成员变量。
  3. 在Java中是不允许使用static修饰局部变量的。这是Java语法的规定。

    final

    final修饰的类不能被继承,常量化