一、类的定义与使用
我们使用关键字class来定义类,一个源文件只能存在一个主类(public class),而class声明的普通类可以存在多个,语法如下:class 类名称(属性:成员属性、对象属性;方法:成员方法、对象方法)
例如我们定义一个Dog 类:
class Dog {
//属性. 直接定义在类中.不加任何关键字
//成员变量
2 usages
String name; // 名字
String color; // 毛色
//方法-行为
//成员方法
public void barks() {
System.out. println(name + " 汪汪汪!");
}
public void wag() {
System.out .println(name + " 揺尾巴");}
}
Dog类只是一个模板,没有具体的意义,该类的所有对象都具备的成员属性和成员方法(行为)定义在类中,不同对象的属性值和具体表现出来的行为都是不同的,所以要让这个类有意义我们就需要通过这个类产生对象,我们称之为类的实例化。
构造方法有四大特点:
1.构造方法名字与类名称相同,无法自定义方法名称⒉.构造方法没有返回值类型声明,3.构造方法在创建对象时,由编译器自动调用,且只在对象产生时调用一次。4.若在定义类时,没有明确定义构造方法,则编译器会编译时生成默认的无参构造;若在类中定义了构造方法,则默认的无参构造就不再生成。
static关键字
static表示静态,与类相关,和具体的对象无关,所以当我们看到static关键字时,就知道这个属性或方法与对象无关了,当static修饰属性时,称之为类属性,静态属性,存放在JVM的方法区,通过这个类创造的所有对象都具有这个static修饰的属性,当static修饰方法时,称之为类方法,之接通过类名称调用,与对象无关。
二、面向对象
面向对象的三大特性:封装,继承和多态。封装就是对外屏蔽类内部的一些实现细节,类的外部只能通过类提供的方法来操作类,封装强调的是保护和易用,例如上面说的洗衣机,我们不用管它怎么洗的衣服,只需要按下按键就可以了,Java中主要通过类和访问权限来实现封装;类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符,可见性从小到大依次为:priavte(私有权限,类内部可见)<default(包访问权限,包内部可见)<protected(继承权限)<public(公开的,所有对象可见)。
首先是private访问修饰符,它修饰的属性称为私有属性,这些属性只在当前类的内部可见,若我们想要在类的外部取得或者调用私有属性就要用到getter和setter。 例如我们建一个银行卡的类,类中有卡号,密码和余额三个成员变量,我们查询一下余额,修改一下密码,代码如下:
public class BankCard {
private int cardNum ;//卡号
private String password;//密码
private double banlance =9000.0;//余额
Public BankCard(int cardNum,String password){
this.cardNum=cardNum;
}
继承
继承就是代码复用,增加整个程序的扩展性,继承的语法:使用extends表示继承父类,访问修饰符 class 子类名称 extends 父类 {};父类就是几个类的共性,子类就是各个类,要用继承就需要满足一个is - a原则,比如猫是个动物,狗是个动物。
父类和子类成员关系,1.父类和子类不存在同名的属性和方法,2.若父类和子类成员变量同名,则编译器就会采用就近匹配原则,当父类中存在private私有域,子类在继承父类时,私有域无法直接使用这种继承称为隐式继承,3.父类和子类方法之间的调用,也是就近匹配原则,优先访问子类的同名方法。当产生子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象。
多态
在Java中同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态,例如同一台打印机可以打印出不同的颜色,但想要实现多态,必须同时满足以下三个条件,缺一不可,
1.多态的实现必须依赖继承,在继承体系下才有多态。只有在继承关系的类之间才有多态可言 2.子类必须要覆写父类中的方法
3.通过父类的引用调用子类重写的方法
方法重写,在有继承关系的类之间,子类定义了和父类处理权限不同以外,其他(方法名称,参数列表,返回值类型(向上转型除外))完全相同的方法称为子类重写了父类的方法,子类重写方法的权限 >= 父类方法,方法重写与方法重载基本是完全相反的东西,二者的区别如下:
方法重载是静态绑定,就是在编译时,编译器根据用户传参的不同决定到底调用的是哪个方法,而方法重写是动态绑定,编译时无法确定到底调用的是哪个对象的eat方法,只要在运行时,根据具体传入fun的对象,才能知道到底调用的是哪个对象的eat方法,即运行时才明确调用的是哪个方法。