- 修饰符 属性类型 属性名 = 属性值;
类与方法
- class是数据类型,是一种抽象的数据类型,是对某一类事务的整体描述,如人,动物,植物
- instance是实例对象,如小明,狗
- 一个class可以包含多个field,如public int age;
- private修饰的field要用set、get方法修饰,通过this.关键字调用field
- 属性+方法=类,所以方法在类中,类就是class
- 方法的定义:
修饰符 返回值类型 方法名(…){
//方法体
return 返回值;
} - 方法的调用:
静态方法:类名.方法名;
非静态方法:实例化后再调用
对象类型 对象名=new 对象值;
对象名.方法名 - static是与类一起加载的
- 使用new关键字进行创建时,会给创建好的对象进行默认的初始化,以及对类中构造器进行调用
- 类中含有:
静态的属性 -->属性
动态的行为 -->方法
构造方法与重载
- 创建实例的时候,实际上是通过构造方法来初始化实例的
- new 的本质就是在调用构造方法
- idea中的生成构造方法的快捷键:Alt + insert
- 构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。如public Person(参数){}
- 如果自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法
一个构造方法可以调用其他构造方法,这样做的目的是便于代码复用。调用其他构造方法的语法是this(参数)、 - 一旦定义了有参构造,那么无参构造必须要显示定义
- 在一个类中,可以定义多个方法。如果有一系列方法,它们的功能都是类似的,只有参数有所不同,那么,可以把这一组方法名 做成同名方法。
- 这种方法名相同,但各自的参数不同,称为方法重载(Overload)
举个例子,String类提供了多个重载方法indexOf(),可以查找子串:
int indexOf(int ch):根据字符的Unicode码查找;
int indexOf(String str):根据字符串查找;
int indexOf(int ch, int fromIndex):根据字符查找,但指定起始位置;
int indexOf(String str, int fromIndex)根据字符串查找,但指定起始位置。
封装
- 属性私有,get / set
- idea中的生成get set方法的快捷键:Alt + insert
继承和多态
-
Java使用extends关键字来实现继承。
-
子类自动获得了父类的所有字段,严禁定义与父类重名的字段!
-
继承有个特点,就是子类无法访问父类的private字段或者private方法。这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问。
-
java中只有单继承,没有多继承,一个父亲可以有多个儿子,一个儿子不能有多个爸爸
-
super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName;
-
子类会默认调用父类的无参构造,调用父类的构造器必须在子类构造器的第一行
-
如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
-
super必须调用父类的构造方法,必须在构造方法的第一行
super必须出现在子类的方法或者构造方法中
super和this不能同时调用构造方法 -
this:代表本身调用的这个对象;没有继承也可以使用;this();调用本类的构造方法
super:代表父类对象的引用;只能在继承条件才可以使用;super();调用父类的构造方法 -
在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,方法体不同,被称为覆写(重写)(Override)
-
重写需要有继承关系,子类对父类方法进行重写,是对方法进行重写,属性不能重写
方法名必须相同
参数列表必须相同
修饰符范围可以扩大,但是不能缩小,public>protected>default>private
抛出的异常范围可以缩小,但不能扩大 -
重写的对非静态的方法进行重写,对于静态方法
-
方法的调用只与左边定义的数据类型有关
//A extends B
B b = new A();//父类的调用指向了子类
b.test();//调用A中的test方法
- 方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。
- 多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
- 在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过super来调用。
抽象类
- 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法
- 把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。编译器会告诉我们,无法编译Person类,因为它包含抽象方法。必须把Person类本身也声明为abstract,才能正确编译它
- 无法实例化一个抽象类
- 因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。
例如,Person类定义了抽象方法run(),那么,在实现子类Student的时候,就必须覆写run()方法
接口
- 在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力
- 如果一个抽象类没有字段,所有的方法全都是抽象方法,就可以把该抽象类改写为接口interface
- 当一个具体的class去实现一个interface时,需要使用implements关键字。
- 一个类只能继承自另一个类,不能从多个类继承。但是,一个类可以实现多个interface
- 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。
内部类
- 如果一个类定义在另一个类的内部,这个类就是Inner Class它与普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例。
- Inner Class和普通Class相比,除了能引用Outer实例外,还有一个额外的“特权”,就是可以修改Outer Class的private字段,