loading...

java基础: 封装、继承、多态

封装

一、封装的好处

1、提高安全性

2、提高复用性

3、将复杂的事情简单化

二、Java中的封装体

1、方法安全性:调用者不知道方法的具体实现

2、复用性:方法可以被重复使用

3、简单化:将繁多的代码以一个方法的方式呈现,仅通过调用方法就可以实现功能;代码维护也变得简单类

三、private修饰成员变量

四、构造方法

构建、创造,也叫构造器,用来帮助创建对象的方法,准确的说,构造方法的作用是初始化对象

格式:

    修饰符构造方法名(参数列表){//方法体}
    public class Student {
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String name;
        private int age;
        public void study() {
            System.out.println(this.name);
            System.out.println("-------------------");
            System.out.println(this.age);
        }
    }  

要求:

    1、方法名必须与类名相同
    2、没有返回值
    3、没有返回值类型
注意事项
    1、若未提供任何构造方法,系统会给出默认无参构造
    2、若已提供任何构造方法,系统不再提供无参构造
    3、构造方法可以重载 

Java中封装的概念

将一系列相关事物共同的属性和行为提取出来,放到一个类中,隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
隐藏对象数据的实现细节,意味着一个类可以全面的改变存储数据的方式,只要使用同样的方法操作数据,其它对象就不会知道或介意所发生的变化。

封装的关键

==绝对不能让类中的方法直接访问其它类的数据(属性),程序仅通过对象的方法与对象的数据进行交互

继承

一、Java中的继承

通过扩展一个类来建立另外一个类的过程,叫做继承(inheritance)
通俗地说,所谓继承,就是让类与类之间产生父子关系。
所有的类都直接或间接的继承自:
    java.lang.Object被继承的类叫做父类(基类、超类)继承的类叫做子类(派生类)

二、格式(extends)

class父类{
    //...
}
class子类extends父类{
    //...
}

// 调用类
public class Test {
    public static void main(String[] args) {
        Dog d = new Dog("小白");
        d.setName("小黑");
        d.output();
    }
}
//父类 动物类
public class Animal {
    public String name;
    public int age;

    public Animal(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
//子类 Dog类
public class Dog extends Animal {
    public String name;
    public Dog(String name) {
        super(10);//调用父类构造 如果不写系统会默认调用
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void output() {
        //super.父类方法 子类调用父类方法
        System.out.println("父类的名字是" + super.getName());
        //this.父类方法 子类调用子类方法
        System.out.println("子类的名字是" + this.getName());
    }
}

三、子类继承父类之后有什么效果?

子类拥有了父类的非私有成员(成员变量、成员方法)
父类的私有成员不能被继承

四、继承的优缺点

优点:
    1、功能复用
    2、便于扩展新功能
    3、结构清晰,简化认识
    4、易维护性
缺点:
    1、打破了封装性
    2、高耦合性

五、this和super的区别

1. 查找变量的原则:就近原则
2. 查找变量的顺序:局部变量成员变量父类更高的父类...Object
3. 访问父类变量的方式: super.父类变量名;
4. super:当前对象父类的引用(父类内存空间的标识)
5. 对象初始化顺序:先初始化父类内容,再初始化子类内容
6、this:当前实例化对象

多态

//父类 动物类
public class Animal {
    public String name;

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void eat() {
        System.out.println("吃饭");
    }
}
//子类 Dog类
public class Dog extends Animal {
    @Override //重写父类的eat方法
    public void eat() {
        System.out.println(getName()+"吃骨头");
    }
}
//子类 Pig类
public class Pig extends Animal {
    @Override
    public void eat() {
        System.out.println(getName()+"吃面条");
    }
}
// 调用类
public class Test {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.setName("小白");
        showAnimal(d);

        Pig p = new Pig();
        p.setName("小花");
        showAnimal(p);
    }
    //传统调用
    public static void showAnimal(Dog d) {
        d.eat();
    }
    public static void showAnimal(Pig p) {
        p.eat();
    }

    //多态调用
    //多态的使用场景:父类型可以作为形参的数据类型这样可以接受其任意的子类对象
    public static void showAnimal(Animal an) {
        an.eat();
    }
}


一、什么是多态?

多种状态,同一对象在不同情况下表现出不同的状态或行为

二、Java中实现多态的步骤

1、要有继承(或实现)关系
2、要有方法重写
3、父类引用指向子类对象(is a关系)

为什么父类引用可以指向子类对象?
因为二者满足子类、父类的关系,所以任何一个Dog都可以Animal的形式使用

加载类:

创建子类对象时,先加载父类,再加载子类

构造方法:

先执行父类的构造方法,初始化子类对象的父类成员部分然后再初始化子类成员部分

成员方法:

类的成员方法在方法区开辟空间并有一个地址值,该类的每一个对象都会记录方法区中的地址
在类的加载过程中,创建虚拟方法表,记录了子父类方法重写关系的信息。通过父类引用调用方法时,会查找虚拟方发表,看该方法是否被重写,如果表中记录了重写信息,则执行子类的重写方法。

多态的好处和弊端

多态的好处可维护性:
    基于继承关系,只需要维护父类代码,提高了代码的复用性,大大降低了维护程序的工作量
    为什么要学习多态:
        从程序的模块化和复用性来解释
            封装:隐藏数据的实现细节,让数据的操作模块化,提高代码复用性
            继承:复用方法,从对象的行为这个层面,提高代码的复用性
            多态:复用对象,程序运行时同一个对象表现出不同的行为
            可扩展性:把不同的子类对象都当作父类看待,屏蔽了不同子类对象间的差异,做出通用的代码,以适应不同的需求,实现了向后兼容

多态的弊端
    不能使用子类特有成员
    解决办法:
        向下转型(前提:必须准确知道该父类引用指向的子类类型)

类型转换
    当需要使用子类特有功能时,需要进行类型转换
```
向上转型(自动类型转换)//子类型转换成父类型Animal animal = new Dog();
向下转型(强制类型转换)//父类型转换成子类型Dog dog = (Dog)animal;
注意事项
    只能在继承层次内进行转换,否则可能造成异常(ClassCastException)将父类对象转换成子类之前,使用instanceof进行检查
```
posted @ 2020-03-31 14:33  浮生若梦~  阅读(187)  评论(0编辑  收藏  举报