**概述和作用:**创建对象,给对象中的成员进行初始化,即在创建对象时,除了使用关键字new 之外 还得借助构造方法,来完成对类的实例化。
构造方法格式特点:
(1)无参构造方法
class Student{
public Student(){
System.out.println("无参数方法调用");
}
}
public class gouzao_1 {
public static void main(String[] args){
Student student=new Student(); //实例化对象
}//该方法是无参的构造方法,即构造方法不接收参数,执行后输出即可,无参的构造方法被调用。
}
(2)有参构造方法
为一个属性赋值有两种方法:①、直接访问对象属性 ②、通过setXxx()方法
如果想在实例化对象的同时就为这个对象的属性进行赋值,可以通过带参数的构造方法来实现。
package company;
class Student_1{
private String name;
private int age;
// public Student_1(String name,int age){
// this.name=name;
// this.age=age;
// }
public void show(){
System.out.println("姓名"+name+"年龄"+age);
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
public class gouzao_2 {
public static void main(String[] args){
// Student_1 student=new Student_1("王小五",25); //实例化对象
Student_1 stu=new Student_1(); //有参构造函数实例化对象
stu.setName("三毛");
stu.setAge(24); //使用setXxx设置参数
stu.show();
}
}
1.java中的每一个类都至少有一个构造方法,如果我们没有创建,系统会为我们创建一个默认的无参构造方法。(不显示代码)
2.但是如果我们定义了构造方法,系统就不会再为我们提供默认的无参构造方法了。这个时候想使用无参构造方法必须自己定义。因为实例化对象时,不一定会输入参数,那么没有无参的构造方法,又不输入参数,就会出错。
3.构造方法需要用public来修饰,若使用private,在其他类中无法将其实例化。
4.构造方法是可以重载的。
子类是不继承父类的构造方法的,只是显式或隐式的调用。
子类和父类构造方法的调用:
https://www.jianshu.com/p/f0515d6d9033
①由abstract修饰
②只有方法的定义,没有方法的实现({}都没有)
③子类实现了父类的抽象方法后,可以正常进行实例化,并通过实例化对象调用方法
如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract(abstract只能用来修饰类或者方法,不能用来修饰属性)来表示一个类是抽象的。只要包含一个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。在实现时,必须包含相同的或者更更低的访问级别(public→protected→private)。抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。抽象类的子类为父类中的所有抽象方法提供具体的实现,否则它们也是抽象类。
//抽象类的格式
abstract class className{
//属性
//方法
//抽象方法
}
①由abstract修饰
②包含抽象方法的类必须是抽象类,不包含抽象方法的类也可以是抽象类
③抽象类不能被实例化(需要被继承)
(1)抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。
(2)abstract和final关键字不可以同时修饰一个类。因为final使类不可继承,而abstract修饰的类,如果不继承则无意义。
④抽象类都是要被继承的,子类继承后:(1)子类中重写父类的抽象方法(建议)(2)子类也声明为抽象类
⑤抽象类的意义
(1)父类的意义:(抽象类都是父类,不能被实例化,只能被继承)
①封装所有子类所共有的数据和行为
②为所有子类提供了一种公共的类型,避免该类被实例化
(2)包含抽象方法:为所有子类提供了一个统一的入口(定义公共抽象方法,由子类提供不同的实现)
接口就是指一个方法的集合,接口中的所有方法都没有方法体,在Java语言中,接口是通过关键字interface来实现的。接口可以被看作是抽象类的变体。接口中的所有方法都是抽象的,可以通过接口来间接地实现多重继承。接口中的成员变量都是static final类型。由于抽象类可以包含部分方法的实现,因此,在一些场合下抽象类比接口存在更多的优势。
//接口的格式
interface interfaceName{
//全局常量
//抽象方法
}
①是一个标准,一个规范
②由interface定义
③只能包含常量和抽象方法
(1)接口中的变量默认使用”public static final“来修饰,即全局常量。
(2)接口中定义的方法默认使用”public abstract“来修饰,即抽象方法。
④接口是一种引用数据类型
⑤接口是对继承的单根性扩展
⑥接口不能被实例化
⑦接口是需要被实现/继承的,实现类/子类:必须重写接口中的所有抽象方法,如果不能实现某方法也必须写出一个空方法
⑧一个类可以实现多个接口,用逗号分隔
(又继承又实现时,先继承后实现:extends关键字必须位于implements关键字之前)
⑨接口可以间接继承(实现)
一个类可以通过extends关键字继承另一个(或多个)接口
**抽象类(abstract class):**声明方法的存在而不去实现它的类被叫做抽象类,它用于要创建一个体现某些基本行为的类,并为该类声明方法。但不能在该类中实现该类的情况,不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造或抽象静态方法。Abstract类的子类为它们父类中的所有抽象方法提供实现。
**接口(interface):**是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可以通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个程序体。接口只可以定义为static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。由于有抽象类,它允许使用接口名作为引用变量的类型。
(1)接口只有定义,其方法不能在接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
(2)接口只能包含抽象方法,抽象类则可以包含普通方法和抽象方法。
(3)接口不包含构造方法,抽象类里可以包含构造方法。
(抽象类里的构造方法并不是用于创建对象,而是让其子类调用这些构造方法来完成属于抽象类的初始化操作)
(4)接口需要实现(implements),但抽象类只能被继承(extends)。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此使用接口可以间接的达到多重继承的目的。
(5)接口强调特定功能的实现,其设计理念是“like-a”关系;而抽象类强调所属关系,其设计理念为“is-a”关系。
(6)接口中定义的成员变量默认为public static final,只能够有静态的不能被修改的数据成员,而且,必须给其赋初始值,其所有成员方法都是public、abstract的,而且只能被这俩关键字修饰。而抽象类可以有自己的数据成员变量,也可以有非抽象的成员方法,而且,抽象类中的成员变量默认为default(本包可见),也可以定义为private、protected和public,这些成员变量可以在子类中被重新定义,也可以被重新赋值,抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。 所以,当功能需要累积时,用抽象类;不需要累积时,用接口。
(7)接口被用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共的角色,不适用于日后重新对里面的代码进行修改。
(8)抽象类可以声明和使用字段,接口不能,但可以创建静态的final常量。
简单来说,接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作,但一般而言抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或者更多对象之间的特定交互时,应该使用接口。此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态的main方法。