一、类和对象
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来继承接口
虽然类只能继承一个,但是接口确可以多继承.