Java面向对象三大特性--封装、继承、多态
Java面向对象三大特性--封装、继承、多态
一、封装
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
1、如何封装?
用private访问修饰符修饰属性和方法,这样被private修饰的属性和方法就这可以在本类中使用,其他类中无法调用。
可以使用get和set方法调用被private修饰的属性,在个set方法中可以加入属性控制语句,get方法可以获得当前对象的属性。
public class Test {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>=0&&age<=150){
this.age = age;
}else{
System.out.println("请重新输入");
}
}
}
2、封装的好处
1、 便于使用者正确使用系统,防止错误修改属性
2、有助于系统之间的松耦合,提高系统独立性
3、 提高软件的可重用性 降低了构建大型系统的风险
3、访问修饰符权限
4、static关键字
(1)static
修饰的变量(成员变量)叫作静态变量。
修饰的方法叫作静态方法。
static修饰的代码块叫做静态代码块.
成员变量:
(1)静态变量
(2)实例变量
静态变量和实例变量的区别:
(1)修饰的变量(成员变量)叫作静态变量,没有被static修饰的成员变量叫作实例变量。
(2)访问实例变量,必须通过对象名.成员变量名。
访问静态变量,通过对象名.静态变量 也可以通过 类名.静态变量。
(3)静态变量属于类的,修改了静态变量的值,其他对象中的静态变量的值也会跟着改变。
(在内存中只有一个拷贝)
实例变量属于对象的,一个对象中的实例属性改变了,另一个对象中的实例变量不会跟着改变。
(每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响)
(4)类内部,静态变量可以在静态方法中调用也可以在实例方法中调用。
(5)静态变量只能在类中定义
静态方法 和 实例方法
(1)static修饰的方法叫作静态方法。反之就是实例方法。
(2)实例方法必须通过对象名.方法名调用。静态方法通过类名调用也可以通过对象名调用。
(3)静态方法想调用实例方法,必须通过对象名.方法名调用。实例方法可以直接调用静态方法。
静态方法中不能直接调用实例变量,必须通过对象名.实列变量。
(4)静态方法中不能使用this关键字
(5)实例方法可直接访问所属类的静态变量、静态方法、实例变量和实例方法
5、this关键字
(1)this关键字能够调用属性。(可以在构造方法中调用 也可以在实例方法中调用)
(2)this关键字调用本类中的方法。 注意:别调用成死循环了
(3)this关键字调用构造方法。如果在构造方法中使用this关键字调用其他的构造方法,this关键字应该放在构造方法的第一行。注意:别调用成死循环了
二、继承
(1)子类和父类之间是is - a关系(是一个)
(2)当子类中的代码有冗余的,将冗余的代码放到父类中,子类继承父类。
(3)继承使用extends关键字
(4)继承是单根性的,一个类只有一个父类。
[访问修饰符] class Pet {//父类
//公共的属性和方法
}
[访问修饰符] class Dog extends Pet { //子类,继承父类
//子类特有的属性和方法
}
1、 子类继承父类的:
(1)继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
(2)继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
(3)子类不能继承父类中的私有属性和方法
(4)子类不能继承父类的构造方法,子类能够调用父类的构造方法。
2、super关键字的作用:
(1)调用父类的属性
(2)调用父类的方法
(3)调用父类的构造方法
注意:
super不能访问父类的private成员
super只能出现在子类的方法和构造方法中
3、父类构造方法的调用规则:
(1)使用super关键字调用父类的有参构造方法,必须放在子类构造方法的第一行。使用this关键字调用本类的构造方法,也要放到构造方法的第一行,所以在构造方法中,不能同时使用this关键字和super关键字调用构造方法。
(2)如果子类中的构造方法中没有使用this关键字和super关键字调用构造方法,默认调用父类的无参构造方法。如果子类中的构造方法中
使用super关键字调用父类的有参构造方法,则子类不会在调用父类的无参构造方法。
4、方法的重写
1 子类重写的是 子类继承的父类的方法(构造方法不能被重写)。
2 当父类中的方法不能够满足业务需求的时候,重写父类中的方法。
3 重写时,可以用super.方法的方式来保留父类的方法
4 子类中特有的方法,不能被重写。
5 @Override 标识某个方法是方法重写。
重写规则:
1 子类重写 子类继承父类的方法
2 方法名相同 参数列表相同
3 方法的返回修饰符不能严于父类方法的访问修饰符
4 方法的返回值是父类方法的返回值的子类或者是父类方法的返回值的类型
三、多态(继承关系)
多态:同一个引用类型,使用不同的实例而执行不同操作。
1、向上转型:
子类对象赋值给父类类型的变量。
将子类对象赋值给父类类型的变量。父类变量调用的方法,如果该方法是子类重写过的父类方法,调用的就是子类重写父类的方法。如果该方法子类没有重写父类的方法,调用的是父类的方法。
public void cure(Pet pet) {//父类当作方法的参数
pet.toHosiptal();
}
父类当作方法的返回值
public Pet give(String type) {//父类当作方法的参数
if (type.equals("dog")) {
return new Dog();
} else {
return new Penguin();
}
}
2、向下转型
将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换。
可以调用子类的特有方法
Dog dog=(Dog)pet;//将pet 转换为Dog类型
dog. catchingFlyDisc();//执行Dog特有的方法
3、抽象方法:
(1)不含有方法体的方法是抽象方法。
(2)抽象方法使用abstract关键字进行修饰。
(3)含有抽象方法的类是抽象类。抽象类使用abstract关键字进行修饰。
(4)抽象类中不一定含有抽象方法。
上一篇: (三)Git的常用操作