对象和封装
构造方法
构造方法是一个特殊的方法。
语法
1、构造方法名必须要与定义它的类名一致。
2、修饰符后直接加构造方法名,无返回值甚至连void也没有,如:public Dog(){}
3、构造方法中可以没有参数也可以有多个参数
4、构造方法的调用是在创建一个对象时使用new进行操作的。
作用
在构造方法中初始化对象,如
public Dog(){
this.name="小白";
this.age=2;
}
有参无参构造方法的区别
无参的构造方法:我们之前一直都没有写过构造方法,但是我们在 new对象的时候其实已经在调用无参的构造方法了,因为系统会默认给我们提供一个无参的构造方法,如;Dog dog = new Dog(); 就是调用了无参数的构造方法,这种方式赋值就只能用dog.属性名的方式赋值。因为方法里面没有参数。
有参构造方法
我们也可以自己写有参数的构造方法,但是,我们只要写了有参数的构造方法系统就不会默认提供无参数的构造方法了,如果在写了有参数的构造方法的时候 再写 Dog dog = new Dog(); 就会出错,所以我们写了有参数的构造方法还想用无参的new对象方式就需要在类中写出无参的构造方法
推荐做法:在新建类的时候,有参数无参数的构造方法我们都一并写了
重载
方法名相同,参数列表不同(个数,类型,顺序),与访问修饰符和返回值类型无关
public Dog(){}
public Dog(String name,int age){
this.name=name;
this.age=age;
}
public Dog(String name,int age,String strain){
this.name=name;
this.age=age;
this.strain=strain;
}
如果是 Dog d = new Dog(); 调用的就是无参数的构造方法
如果是 Dog d = new Dog(“小花”,4); 调用的就是有两个参数的构造方法
等等
在调用构造方法的时候,传入的参数类型个个数以及顺序都需要和构造方法一致
常见错误:局部变量必须赋值,全局变量可以不需要赋值,有默认值(String 类型null ,int类型0)。
static
1、使用static修饰的变量或方法就是静态变量或方法。
2、static随着类的加载而加载。静态属性和方法都优先于普通属性和方法。
3、在静态方法中不能使用this关键字。
4、属性和方法也都可以通过创建对象的方法调用,但是推荐使用类名直接调用的方法。
5、使用场景举例:饮水机我们可以在教室一人一个的,但是浪费教室空间,所以我们放在了外面供大家一起用共享,使用static,如果是水杯(个人使用)就不适合static。
封装
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过提供的方法来进行访问。
封装的使用:
1、将属性私有化(private)
2、创建公有的getter/setter方法,用于属性的读和写
3、在getter/setter方法中加入属性控制语句,对属性的合法性进行判断
this
this.属性名
this.方法名()
修饰构造方法 : this()/this(参数);调用构造方法的时候只能在构造方法的第一句
继承
使用关键字:extends
哪些不可以被继承:
1、private修饰的成员
2、子类与父类不在同包
3、构造方法
访问修饰符
private:私有的只能在本类中可以访问
default:本类和同包中可以访问
protected:本类,同包以及其子类可访问
public:公共的处处可访问
重写
1、出现在有子父类的情况下
2、方法名和参数列表都需要相同
3、返回值类型相同或者是其子类
public Pet method(){
return new Pet();
}
public Pet method(){
return new Pet();
}
4、访问修饰符的权限不能严于父类
5、抛出异常不能大于父类
最简单的重写就是,直接将父类的方法赋值到子类中,我方法名参数列表修饰符返回值都一样那不会出错
抽象类
关键字:abstract
1、抽象方法必须是在抽象类中,抽象类中不一定有抽象方法。
2、抽象方法必须在子类中被实现,除非子类是抽象类
final
1、类不希望再被其他类继承
2、方法不希望被重写
3、属性不希望被修改
多态
多态:同一个引用类型,使用不同的实例而执行不同操作 (父类引用指向子类对象)
如何使用?
1、编写具有继承关系的父类和子类
2、子类重写父类方法
3、使用父类的引用指向子类的对象(使用父类作为方法行参实现多态或使用父类作为方法返回值实现多态)
父类到子类转换(向下转型)
Pet pet = new Dog(“ouou”,“雪纳瑞”);
Dog dog =(Dog)pet;
作为Dog的父类Pet,将pet转型为Dog类。
instanceof运算符
对象 instanceof 类或接口 ,在这里我们使用的是对象类型强制转换前的判断。
例:
Person p = new Student();
//判断对象p是否为Student类的实例
if(p instanceof Student)
{
//向下转型
Student s = (Student)p;
}
向上转型
结构:父类 父类对象 = 子类实例
1.父类有的方法,都可以调用,如果被子类重写了,则会调用子类的方法。
2. 父类没有的方法,而子类存在,则不能调用。
3.向上转型只对方法有影响,对属性没影响。属性不存在重写。
Person per = new Student();
Student st=new Student();
per.print();
per.car();
接口
关键修饰词:interface
public interface UsbInterface{
void service();
}
实现接口使用的关键字:implement
publicclassUDisk implements UsbInterface {
public void service() {
System.out.println("连接USB口,开始传输数据。");
}
}
接口特性
1、接口不可以被实例化
2、实现类必须实现接口的所有方法
3、实现类可以实现多个接口
4、接口中的变量都是静态变量
接口注意事项
1、接口当中的抽象方法,修饰符必须是两个固定的关键字,public abstract
2、这两个关键字修饰符,可以选择性地省略
3、方法的三要素,可以随意定义
4、实现类并没有覆盖重写接口中的所有的抽象方法,那么这个实现类自己就必须是抽象类
使用接口
1、接口不能直接使用,必须有一个“实现类”实现该接口
2、接口的实现类必须覆盖重写(实现)接口中所有的抽象方法 实现:去掉abstract关键字,加上方法体大括号
3、创建实现类的对象,进行使用
接口默认方法
1、可以直接调用,无需在其他类中覆盖重写
2、在其他类中可以覆盖重写interface修饰类中的方法