面向对象三大特征------封装,继承,多态
封装:尽肯能的隐藏对象的内部细节,控制对象的访问修改权限
类中定义私有属性:
private int age;
实例对象,对属性进行赋值
Dog dog =new Dog();
dog.age = 20; 报错 私有属性不可访问,,如果不是private直接赋值可能会有非法数据的录入
这时可以在类中定义公共方法 setter getter方法,对象外可以通过调用set方法进行赋值,在set方法中判断输入数据是否合法
继承:类与类之间的特征和行为的一种赠与或获得
在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用 子类 extends 父类
可以直接调用父类的属性和方法,提高代码复用性和可扩展性
不可继承:构造方法 ; Private修饰的属性方法 ; 父子类不在同一个package中时,default修饰的属性和方法;
方法重写:父类的方法不能满足子类,在子类中重写方法,方法名,参数,返回值类型必需相同,访问修饰符可以相同或扩大范围,主要是对方法内部的代码进行修改
super关键字可以在子类中访问父类的方法 super.方法名();访问父类的方法,完成父类方法在子类中的复用,在添加其他代码 super.属性 也可以访问父类属性; super(value); 调用父类构造方法,无参/有参
this 与super必需在构造方法首行,且在同一个类的同一个构造方法只能出现一个
父子类的同名属性无关,不存在重写关系,使用时 用不同的前缀
class A { public void aa ( ) { syso ( 输出 ) } }
class B extends A { a(); public void a ( ) { super.A( ) ; syso(代码) } }
//复用父类方法 输出 : 输出代码
子类在创建对象中,会先对父类创建对象,最终形成完整子类对象,有父类的共性内容,还有子类自身添加的内容
访问修饰符:public protected default private
private : 仅本类可以使用(多)
default : 同包下可以使用,默认修饰符(少)
protected : 不同包下的类可以使用(少)
public : 都可以使用(多)
多态:父类引用指向子类对象,从而产生多种形态。
Animal animal = new Dog(); (多态核心概念,向上转型,装箱)
Dog dog = (Dog) animal; (向下转型,拆箱)
将父类引用中的真实子类对象强制转回子类本身,只有转回子类真实类型,才可以调用子类独有的属性和方法。
instanceof 判断引用的对象的类型 语法:父类引用 instanceof 类型 返回true/false
二者具有直接或间接的继承关系时,父类引用可指向子类对象形成多态。
父类引用仅可调用父类所声明的属性和方法,不可调用子类独7有的属性和方法
方法重载使用太多,耦合太高,可以使用父类作为方法参数,,使方法参数类型更广泛
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态好处:
- 可替换性
- 可扩充性
- 接口性
- 灵活性
多态使用场景:
- 使用父类作为方法形参实现多态,使方法参数的类型更广泛。
- 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
```java
1
public class Animal { //父类animal
public Animal(){
System.out.println("animal");
}
public void feed(Animal animal) {
System.out.println(animal.name);
}
}
public class Student extends Animal{ 子类Student
public Student(){
System.out.println("Student");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.feed(new Student()); //使用父类作为方法形参实现多态,使方法参数的类型更广泛
//等价于 Animal animal2 = new Student(); animal2.feed(animal);
//可传递本类型对象和所有子类对象
}
}
2
public class Animal { //父类animal
public Animal(){
System.out.println("animal");
}
public Animal buy(int money) {
if (money>2) {
return new Person(); //返回父类对象指向的子类 可返回本类型对象和所有子类对象
}else {
return new Student();
}
}
}
class Person extends Animal(){ //子类 Person 继承animal
public Person(){
System.out.println("Person");
}
}
class Student extends Person(){ //子类student 继承 Person
public Student(){
System.out.println("Student");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.buy(3); //使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
//调用父类的buy方法,返回类型是 Animal ,所以返回的是new Student,,(父类对象指向子类)
}
}