类和对象
类(class):具有相同属性和行为的独享的集合。
方法:描述对象的动作,在程序中,通过定义变量的像是表现属性
属性:描述对象的特征和行为
创建对象
类名 变量名=new 构造方法([参数])
//创建一个宠物对象
Pet pet = new Pet();
pet.nickName = nameList[j];
pet.type = typeList[i];
创建对象时,用'. '操作符进行访问类中的非私有属性和方法
变量
1.成员变量:定义在类中,类的属性,有默认值,通过对象访问
2.局部变量:定义在方法中,没有默认值,只能在方法中赋值后能用
3.静态常量:特殊的成员变量,有默认值,通过类名访问
构造方法
public 类名称(参数类型 参数名称){
方法体
}
/*
* 自动生成构造方法
* 全参构造
* 鼠标右键generate(或alt+insert) ==> constructor ==> 要生成的属性(全选)
* 无参构造
* 鼠标右键generate(或alt+insert) ==> constructor ==> select none
* */
public Student(int id, String name, String major) {
this.id = id;
this.name = name;
this.major = major;
}
public Student() {
}
面向对象三大特性
一丶封装
步骤:
1、各类中的所有属性添加private访问修饰符
2、给每个属性添加getxxx()方法用于读取属性,添加setxxx()方法用于给属性赋值(快捷方法:按alt+inster ==>getter and setter)
private int id;
private String name;
private String major;
/*
* 自动生成getter/setter
* 鼠标右键generate(或alt+insert) ==> getter and setter ==> 全选属性
* */
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
3丶重点:创建对象后,无法通过.访问属性,只能通过get/set方法
public static void main(String[] args){
Student stu = new Student();
//stu.stuId=111;无法通过.赋值和读取
//只能通过set方法赋值
stu.setStuId(10026312);
//只能通过get方法获取私有属性的值
System.out.println(stu.getStuId());
}
二丶继承
类A可以通过extends关键字继承类B。
语法:class 类A extends 类B{}
类A称为子类、派生类、衍生类、subClass
类B称为父类、根类、超类、superClass
继承后,子类可以访问父类中非私有(没有被private修饰的内容)的属性和方法。
不同的子类中如果有相同的代码,都可以把它们提出来保存到父类中,从而减少子类中的代码冗余。
继承的特点
1.子类对象可以直接访问父类中非私有(不用private修饰)的属性和方法
2.子类可以对父类中的方法进行扩展或覆盖,这称为方法重写。重写后,子类对象再调用该方法时,
3.执行的是重写后的内容
4.Java中是单继承。一个子类只能extends一个父类,一个父类可以有很多个子类
5.Java中可以多重继承。类A可以继承类B,类B可以继承类C,这时类A既是类B的子类,也可以称为类C的子类,可以访问类B与类C中非私有的成员
6.任何类都是Object类的子类
7.在创建子类对象时,会先执行父类中相应的构造方法
//父类
public class Father{
public Father(){
fun();
}
public void fun(){
System.out.println("父类中的普通方法");
}
}
//子类继承自父类
public class Son extends Father{
public Son(){
fun();
}
public void fun(){
System.out.println("子类中的普通方法");
}
}
方法重写Override(快捷键ALT+O)
当子类继承父类后,可以对父类中的非私有的方法进行扩展或覆盖,这个过程称为重写。
要求:方法名、参数列表、返回值必须和父类一致;访问权限不能比父类更严格;不能抛出比父类更大的异常。
方法重载overload
在一个类中,多个方法的方法名相同,参数列表不同时,这些就是重载的方法。即同名不同参
要求:方法名相同;参数列表(类型和数量)不同;与返回值无关。
this和super关键字
当对象使用:"this.属性"或"this.方法"或"super.属性"或"super.方法"。此时的this或super表示“当前类”或“父类对象”
public calss Person{
private String name;
public void setName(String name){
this.name=name;//这个this表示当前类Person的对象
}
当构造方法用:"this([参数])或super([参数])"。此时的 this([ 参数 ]) 或 super([ 参数 ]) 表示当前类或当前类的父类的某个构造方法。
public class Person(){
private String name;
private int age;
public Person(){
//这句话表示调用Person(String name,int age)构造方法,只能放在第一行
this("小明",20);
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
Object类
它是所有类的父类,任何类都可以间接地继承了该类,但没有明确的在extends中体现出来。所有类都可以访问Object类中的方法,或对其进行重写。
向上转型
Person p = new Person();
Object obj=p;
向下转型
Animal an = new Animal();
Cat c=(Cat)an;
三丶多态
多态就是子类的对象指向父类的引用 ( 子类对象使用父类变量接收,即向上转型 ) 。
父类 变量 = new 子类 ();
public class Father{
}
public class Son extends Father{
}
public class Main{
public static void main(String[] args){
Son son = new Son();
//这就是多态的体现
//子类的对象,可以使用父类的变量保存
Father father = new Son();
}
}
抽象类(abstract)
修饰方法: 访问修饰符 abstract 返回值类型 方法名(参数类型 形参名称);
//当一个类中有抽象方法时,该类也需要是一个抽象类
public abstract class Game{
//这就是一个抽象方法,没有方法体
public abstract void startGame(Player player);
}
特点
修饰类:被修饰的类称为抽象类
1、抽象类不能被实例化,无法创建对象。
2、抽象类中有构造方法,在创建其子类对象时,自动调用执行。
3、抽象类中可以有抽象方法,也可以有非抽象方法。
4、抽象类的子类要么继续成为抽象类,要么重写抽象父类中的所有抽象方法。
修饰方法:被修饰的方法称为抽象方法
1、抽象方法没有方法体。
2、抽象方法只能出现在抽象类或接口中。
3、abstract 不能修饰构造方法和静态方法。
接口 (Interface)
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法,接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
与类的区别
1、接口不能用于实例化对象。
2、接口没有构造方法。
3、接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
4、接口不能包含成员变量,除了 static 和 final 变量。
5、接口不是被类继承了,而是要被类实现。
6、接口支持多继承。