Java基础_面向对象概念_this关键字_static

面向对象

面向对象思想同表结构思想类似,关系型数据库中存储数据,有表和字段。而映射到java中就是类与属性的关系。数据库字段的类型对应类的属性的类型,不同的是,Java类中有自定义的方法。表示该类做的“动作”或者称执行的任务。
数据库存储数据面向对象编程中,表的字段field就是类的属性。
在这里插入图片描述上述就是数据库设计与java类设计之间的映射关系(对应关系)。不同的是类中多出了方法。

方法指的是:此类都会有的任务(动作),例如定义一个狗的类别,狗有很多种,或者有很多不同的特征,比如比特犬毛发少,矮小,痛觉神经不明显。金毛智商高,毛也比较长。这些对应到类种就是不同的狗之间的属性有差别。而他们的相同之处,或者只要是狗都会干的事,比如汪汪汪的叫,还有4只腿奔跑。那这种狗这个类别都会干的事就是方法,方法只要定义了,这个类别的实例都可以使用,而不需要重复去定义。方法也是执行的事情,

面向对象与面向过程

面向对象是指:面向整体的思想,学习物理的参考系的时候,也会有一个当作整体的概念。比如两辆相同速度相同方向的汽车,就可以当作整体的一辆汽车来进行计算。而面向对象正是从整体上去考虑。然后一个级别一个级别划分下去,如同金字塔。用造汽车来说明的话,对于一个整体的汽车。我们可以划分为,引擎,车身,底盘,轮胎,内部装饰等等部分。而这些部分可以再次细分。把整体拆分为部分,一层层下去。而到最底层。运用的则是面向过程的思想去实现。一步步往上层实现。然后各个部分再拼接起来。
面向过程是指: 从上往下,一步一步开发。而随着软件的规模的变大,这样一步步开发,亲力亲为变得特别困难,效率也非常底下,就比如造汽车如果面向过程来实现,那么一个人从引擎开始造。别人无法接手他的工作,所有的部分都得自己动手。这样可能一个人1年只能生产出个位数的车数。所以单单用面向过程来实现大型项目是特别愚蠢的。

总结:过程和对象,是相辅相成的。对象的底层必须是依靠过程的方法来实现的。面向对象是一种设计者的思维,而面向对象是一种执行者的思维。在宏观上需要面向对象来把控,而微观上需要面向过程来执行。而我们需要学会的是面向对象的去分析一件事。而对象说白了就是一种数据管理模式,把数据的内容和行为放到了一起,本质上是一种数据的组织方式。

类和对象

是面向对象的基本单位。相当于是一张表格,或者一份图纸,他是一种抽象的概念,类中定义了一类对象的共同特征,就如人这一类,在属性上,有姓名,有身份证号,有性别,有年龄,在行为上,会说话,会走路,会跑,受伤了会哭 。这都是人类的共同特征。而类就是统一归纳这些共同特征的。Java中类叫clss。
对象是类的实例。就是在图纸的基础上去具体化事物。比如人类具体到某个人,张三,身份证:489461,性别男,说话东北口音。等等的。Java中实例叫instance。

定义 【限定修饰符】+ class +【类名】{
属性;
方法{}
}
例如: public class Student{
int age;//属性
String name;//属性
public void getName(){ //方法
}
}

构造方法

构造方法也成为构造器,是类初始化的时候自动加载的方法,用来创建类的实例。他只有在类被初始化的时候才能调用,并且不能在自身的方法中使用。
定义 【限定修饰符】 + 类名(【参数列表】){ //没有参数代表无参构造器。
//语句
}

TIPS:1、Java中通过new关键字来调用构造器,返回一个类的实例(它没有返回类型,类的实例就是它返回的东西。强制规定的)。
2、如果我们没有定义构造器,系统默认会有一个无参的构造器。如果已经定义了一个带参数的构造器,那么系统不会定义无参构造器。需要自己手动定义。
3、构造器的名称必须和类名一致。

创建对象的具体步骤:1、遇到new关键字,分配对象空间,并将对象的成员变量初始化为0或者null。
2、执行属性值的初始化。
3、执行构造方法(构造器)
4、返回对象的地址。

构造方法也可以重载,重载的概念与方法一致。不多加赘述。
如果构造参数中的形参名称和属性名相同时,需要用到this来区分,this关键字代表此对象。后面后加以细说。

引用的知识

除了基本数据类型(保存在栈中),其他数据都保存在堆中,堆中存储的数据赋值时候,是将自己的地址值赋值给变量。而这就叫做引用,一个变量只能引用一个对象。一个对象可以被多个变量引用,那些变量保存着此对象相同的地址值。其中一个变量修改该对象,那么其他变量都可见。

This关键字

This 有3中用法

1、区分形参和属性
当方法或者构造器中的参数与类中的属性名称相同时,需要用this.属性来区分。this在这里的作用时代表该对象。

class Student {
  String name;
  public Student(String name) {
    this.name = name;   //this 代表该对象。
  } 
}

2、用来在构造器中调用其他构造器
当需要执行两个构造器时,可以在构造器中使用 this(参数列表) 来调用构造器,规定必须是代码的第一行。

class Student {
  String name;
  public Student(){
  }
  public Student(String str) {
    this();
    this.name = str;
  }
}

3、让类中的一个方法访问到类中的另一个方法
当需要使用到类中的另外一个方法时,用**this.方法名()**来调用此类中的方法,也可以直接用方法名来调用,只是系统默认会添加this。

class Student {
  String name;

  public Student(){

  }
  public Student(String str) {
    this();
    this.name = str;
  }
  public void getName(){
    this.setName();
    System.out.println("得到名称");
  }
  public void setName(){
    System.out.println("设置名称");
  }
}

static 关键字

static可以用来修饰属性和方法和类。
作用:方便我们在没有创建对象的情况下使用类的方法。被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。

static修饰类
java有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。这样可以直接通过**外部类.内部类()**获取到内部类的实例。

class Student {
  
  public static class Innerclass{
    
  }
}

static修饰方法
修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用:

static关键字修饰变量
被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。

static关键字修饰代码块
静态代码块在类第一次被载入时执行,类初始化的顺序。
父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

父类普通变量

父类普通代码块

父类构造函数

子类普通变量

子类普通代码块

子类构造函数
验证此顺序

class Human{
    static String name="父类静态变量";
    String commonName="父类的普通变量";
    static{
        System.out.println(name);
        System.out.println("父类的静态代码块");
    }
    {
        System.out.println(commonName);
        System.out.println("父类的普通代码块");
    }
    public Human(){
       
        System.out.println("父类的构造器");
    }
}
class Student extends Human{
    static String stName="子类静态变量";
     String commonStName="子类的普通变量";
    static{
        System.out.println(stName);
        System.out.println("子类静态代码块");
    }
    {
        System.out.println(commonStName);
        System.out.println("子类的普通代码块");
    }
    public Student(){
        System.out.println("子类的构造器");
    }
}

运行结果
顺序: 构造子类时,先往上执行父类,静态(变量–>代码块)–>子类的静态(变量–>代码块)–>父类的普通(变量–>代码块–>构造器)—>子类的普通(变量–>代码块–>构造器);(往上追溯到最后一位继承)
总结:执行完构造方法,对象已经生成,因此对象中的初始化工作应该在此之前就做完。包括普通变量的加载和普通代码块的加载。普通代码块每次构建新对象的时候才会加载。和变量初始化一致。而对于static 修饰的变量来说。在类构建加载的时候就会完成初始化。因此只最先加载。也是从父类到子类的顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值