Java之类和对象

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、类和对象

C++和Java都是面向对象编程的语言,而C和Go是面向过程编程的语言.

主要概述一下面向对象编程,也就是op.在面向对象的世界中,一切皆对象.解决问题的途径主要是靠对象之间的交互去完成.

类的模板

类就是对一种事物的概述,比如说猫类,狗类,人类等等,在这些类中,有成员变量和成员方法.变量主要是表示这类中性质的定义,方法则是对这类中行为的概述.

class  类名{
     //成员属性

     //成员方法
}

类的实例化-------对象         

有了类之后,就应该去实例化一个类,称之为对象,而对象就是实实在在的存在的事物,因此对象也成为类的实例化.比如名为王三的这个人,就是由人类实例化出来的.例如:

//定义了人类,里面可以有姓名,年龄,性别等等
class Person{
   String name;
   public void getName(String name){
        this.name=name;
   }
}


public class Main{
   public void static void main(String[] args){
        Person person = new Person('王三')//实例化了一个对象
   }
}

在实例化的过程中,使用new去创建一个对象

使用 . 来访问对象中的成员属性和方法

同一个类可以实例化多个对象,毕竟不可能只有人类中只有一个人吧.

成员变量和局部变量

成员变量:类的内部,方法的外部就是成员变量,成员变量有默认值,当然也可以在定义变量时赋值,不过这个看你未来的项目需求,一般没什么用,其生命周期是从对象创建时开始,到对象销毁就结束.

局部变量:方法内部,无默认值,进入方法创建,出方法结束.

构造方法

构造方法是一种特殊的成员方法,对成员中的成员属性进行赋值的方法.

其方法名和类名一致,没有返回值,在上面的人类中的方法就是一个构造方法.

如果类中没有写构造方法,那么会存在一个隐藏的无参构造方法,但是一旦存在一个构造方法,那么将不会存在任何的构造方法.

如果有多个构造方法,那么就构成重载.对于重载,也就是方法名必须相同,参数列表可以不同,返回值不做要求.因此对于构造方法来说,完全符合要求.

this引用

this一般可以不用,但是习惯使用.

对于this来说,如果实例化两个人类,那么调用方法时,如何得知是哪个对象去调用.其实在每一个方法中都含有一个隐藏的this在形参中,这样就可以知道是哪个对象去调用了这个方法.因此,this表示了当前对象的引用,就看谁调用了这个方法,慢慢理解,第一次接触当然不太容易懂了.值得注意的是静态的并不能使用this,这需要到static才可以了解.大家也可以通过标题跳到static中.

一般有三个用处:

第一个就是调用成员变量,this.name

第二个就是调用成员方法,this.getName( )

第三个就是调用构造方法,this(.....),括号中给出的就是值就是给另一个构造方法的值.举个比方,如果给一个无参构造,那么为了使其有一个特定初始值,因此在构造方法中放一个this(某个/些成员属性的值),这样给其一个特定的值,使得代码不至于太过冗杂.

对象的生成

首先为对象分配内存,这时引用就有了,也就是说对于类来说,不管是自定义的,还是Java给出的,都是相同的,这就是引用.当引用完成后,进调用造方法,这时对象就生成了.

二、三大特性之封装

封装定义

将数据和操作数据的方法进行结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互.

对于我自己的理解来说,就是不用去实现,只去使用就可以了,比如说对于一个字符串来说,使用charAt就可以获得某个字符.这就是面向对象编程的好处.

自定义包:其实就是文件夹,将一些类放于其中.

对于import来说,就是导入包,也就是在类中可以使用自定义包或者Java本身的包.

对于package来说,就是表示当前在哪个包中.

是可以包套包的,也就是无限套娃,可以类比于文件夹来说.

访问修饰限定符

1. private:只能在当前类中进行访问

2. 包访问权限(default):对于同一包中,可以访问其成员

3. protected:需要学到继承才可了解,权限又会增大一步,可以访问不同包的子类

4. public:最宽松的访问权限,任何情况下都可以使用

static成员

使用static修饰的称为静态成员(类成员),还有非静态成员(普通成员)

非静态成员/普通成员都需要对象的引用去调用

使用static的成员,不依赖于对象,而是直接跟类相关.置于方法区.直接使用类名就可以访问.

静态成员方法内部不能使用直接使用非静态成员的变量和方法,有因为当main函数中使用某类的静态成员方法时,是不需要实例化对象的,但是普通成员变量需要必须得实例化后才可以,因此在静态成员方法内部不能直接使用非静态成员的变量或者方法,如果要使用,那么就需要new.

对于静态成员变量来说,可以就地初始化,也就是直接赋值,还可以通过代码块进行赋值,也可以通过get和set方法,但此时也应将方法设为静态的,否则没有什么意义.比如说有非静态的成员变量,但要想初始化还需要去实例化一个对象,那么毫无作用,本来就是想通过类名直接访问的.

代码块

1. 普通代码块:有花括号括起来的代码块,定义在方法内部,我觉得没什么作用

public int getAgew(){
    {
        System.out.println("给出此人的年龄");
    }
    return this.age;
}

2. 构造代码块:类内部,方法外部,用来初始化非静态成员.先执行构造代码块,再执行构造方法.可以类比于将此代码块置于构造方法的最前端.如果有多个构造代码块,则看顺序,谁在前面,先执行谁的.

//比如下述结构,最后name被赋值是赵四,而不是王五
//因为先执行王五,再执行赵四

{
      this.name="王五";
}
      public String name="赵四";

3. 静态代码块:最先被执行,并且只被执行一次,并且如果只是静态代码块的话,按顺序执行

只要使用到类,就会被执行,而是是第一次使用到类,第二次使用则不会被执行,只执行一次

//使用static修饰

static{
     name="王五";
     System.out.println("禅师");
}
     public static String name="赵四";

 代码块执行的大致顺序就是

静态代码块 - > 实例代码块(构造代码块块) - > 构造方法

三、三大特性之继承(extends)

基本概念

class Cat extends Animal{


}

上述代码中,子类就是猫类,也称作派生类.

父类就是动物类,也称作基类/超类

意义

就是减少代码的冗杂度,加强代码的复用性.

super的使用

super和this类似,this指代的是当前对象属性,super则是指代父类的属性.

切记:但是super并不是代码父类对象的引用,子类继承和父类,但是使用时只是new了子类对象,而没有new父类对象,因此不可称作父类对象的引用,super只能称作关键词.

super也有三个作用:引用父类成员变量/引用父类成员方法/进行构造方法的调用

值得注意的是,使用this进行构造方法的调用时,需要将其放在第一行,而super进行父类构造方法的调用时,也需要放在第一行,因此两者不能同时使用.并且在子类中进行使用构造方法时,要先将父类的构造方法使用super构造好,不然无法使用.如果父类有无参的构造方法,那么在子类中,super()可不写.

对方法的调用

另外,在进行使用时,一般都是采用就近原则的方法:如果一个方法子类有,那么就调用子类的;子类没有,再去调用父类的.如果子类和父类都有,那么还是调用子类的,如果想要调用父类的,那么就需要用到super来进行调用.

代码块的终极执行顺序

先执行父类的静态代码块   - >   再执行子类的静态代码块   - >   无论是谁的静态代码块,都只能使用一次,没有第二次使用机会   - >   再执行父类的实例化代码块   - >   再执行父类的构造方法   - >   再执行子类的实例化代码块   - >   最后执行子类的构造方法   - >   我认为实例化代码块这个东西,不管有没有花括号,都会进行执行.并且对于同一类代码块,按照定义的先后顺序执行.

继承方式

单继承方式,也就是一个类只能继承另一个类,而不能继承多个,和C++有区别,C++有多种继承方式.

final

和C中的const差不多,表示常量的意思,并且必须赋初值.

例如:有一个数组

final int[] array = new int[]{1,2,3};

这表示引用不能变,但是其中的值还可以变.如何理解这个问题呢?

 如图所示,表示的引用也就是0X9,其实是0X9不能变,但是0X9指向的值是可以变的,也就是1,2,3是不受其约束的,可以随意改变值,需要多画图理解.

四、三大特性之多态

基本概念

多喵喵;而狗在叫时就是汪汪叫.态是三大特性之一,更是一种思想.当不同子类去调用父类时,会获得不同的结果.比如猫在叫时就是

多态的实现条件

向上转型,重写,继承

向上转型

在子类继承父类后,实例化对象时体现的一种性质.如下述代码中猫类继承动物类.

在发生向上转型以后,只能调用父类的成员变量和方法而不能调用子类的成员变量和方法.

Dog cat = new Cat();

向下转型

向下转型是有危险性存在的,可以利用instanceof进行判断

Animal animal = new Cat();
Cat cat = (Cat)animal;

这就是向下转型,当向下转型发生后,子类的方法和属性也可以调用.

重写

重写指的就是在子类中重写父类的方法.

重写中,方法名,参数列表和返回值都必须相同,而访问修饰限定符子类中的必须大于等于子类中的,我们称之为协变类型.

在重写的过程中,private/static/final修饰的都不可以重写

动态绑定

多态的基础就是动态绑定

动态绑定需要向上转型,重写,通过父类引用,调用子类和父类重写的方法

特点:编译时,不能确定方法的行为;当运行时,才能确定

优点:代码更加灵活

缺点:不能调用子类的特有的方法

静态绑定

其实就是重载

优点:编译时已经确定调用的方法

五、抽象类(abstract)

类中没有足够的信息来完成对类的一个描述称之为抽象类.

在抽象类中,可以没有抽象成员方法和抽象成员属性,但是在普通类中绝对不能有抽象属性和方法.

抽象类就是为了被继承,当抽象方法被继承之后,必须重写其中的抽象方法,如果没有将抽象方法都重写完,那么要将子类也定义类抽象类

既然为了被继承,则重写中不能使用的在抽象中也不能被使用

六、接口(interface)

接口就是抽象类的更进一步,不能实例化,只能被接.

在接口中,方法都是默认的public abstract

属性都是public  static  final,因此必须初始化,没有构造方法

但是jdk8开始,可以写default修饰的方法(这是普通方法)

可以有static方法

使用implements来继承接口

虽然类只能继承一个,但是接口确可以多继承.

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java