目录
面向对象的特征
1. 封装
封装这个特性就是将类中的属性和方法用一些特定的关键字修饰, 使得外部不需要知道内部实现细节, 直接使用即可. 即隐藏内部实现细节, 只暴露出 必要 的信息给类的调用者.
a> private
被 private 关键字修饰的成员, 只能被本类内部成员访问, 不能被其他类访问.
eg1: 本类中访问自己类中的方法, 编译通过.
eg2: 外部类访问 private 关键字修饰的方法, 编译错误.
b> 默认不写
默认不写的成员, 能被同一个包中的类访问, 包外的类无法访问.
eg: Main 类与 Animal 类不在同一个包中, run1()方法默认不写表示只能在该 Animal 类所在的包java0121中访问, 而 Main 类在包java0121外, 因此 animal.run1(); 编译错误; Test 类与 Animal 类在同一个包中, 因此访问可以 run1() 方法.
c> protected
被 protected 关键字修饰的成员, 能被其子类和同一个包的其他类访问.
Cat 类与 Animal 类不在一个包中, 但是是继承关系, 所以可以访问被 protected 关键字修饰的方法.
Cat 类与 Animal 类不在一个包中, 也不是继承关系, 所以不可以访问被 protected 关键字修饰的方法, 否则编译错误.
d> public
被 public 关键字修饰的成员, 能被不同包中的类访问.
e> 访问权限顺序
由低到高: private < 默认不写 < protected < public
2. 继承
类与类之间的一种继承关系( 父子关系 ), 子类继承父类.
在继承时, 子类会继承父类的成员变量和成员方法.
a> extends 关键字
extends 关键字前面写子类的类名, 后面填写父类的类名
public class Animal {
String name = "小动物";
}
public class Dog extends Animal {
}
b> 被 final 关键字修饰
被 final 关键字修饰的类, 不能被任何类继承.
3. 多态
a> 向上转型
创建子类的实例使其指向父类
Dog 为子类, Animal 为父类
Dog dog = new Dog();
Animal animal = dog;
向上转型后, 不能访问子类所特有的方法.
eg: 下面 animal.special();这行代码编译不通过.
b> 动态绑定( 方法重写 )
子类将父类的方法重写后, 使用父类引用调用重写的方法时, 访问到的是子类的方法.
父类
public class Animal {
public void run() {
System.out.println("Animal is " "running");
}
}
子类
public class Dog extends Animal {
public void run() {
System.out.println("Dog is " "running");
}
}
测试类
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Animal animal = dog;
animal.run();
}
}
运行结果
c> 重载与重写区别
重载是在一个类中有一个以上的同名方法. 要求: 参数个数,类型不同.
重写是针对有继承关系的两个类, 子类重写了父类的方法. 要求: 重写的方法其父类的访问权限不高于子类.
eg: 父类 Animal 重写的方法 run( ) 的权限为 public
子类 Dog 重写的方法 run( ) 的权限为 protected
因此父类中 run( ) 的权限高于子类该方法的权限, 编译报错.
b> 向下转型
创建父类的实例使其指向子类
Dog dog1 = (Dog) animal1;
animal1 前必须加 (Dog) 进行强制类型转换, 否则编译错误.
Animal animal1 = new Animal();
Dog dog1 = (Dog) animal1;
向下转型后, 可以访问子类的任何方法 (包含父类中没有的方法).
面向对象中的组合
4. 组合
组合就是其成员变量可以使其他类的实例.
a> 成员变量为其他类的实例
public class Animal {
protected void run2() {
System.out.println( "Animal is " "running");
}
}
public class Dog extends Animal {
public void run2() {
System.out.println("Dog is " "running");
}
public class Test {
Animal animal = new Animal();
Dog dog = new Dog();
public static void main(String[] args) {
}
}
来源:https://www.icode9.com/content-1-830051.html