JAVA封装 继承 多态

1.面向对象程序三大特性:封装,继承,多态

封装:将数据和操作数据的方法结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

2.访问限定符

访问权限可以限定类中成员的可见性,也可以控制类的可见性

JAVA主要通过类和访问权限来实现封装:类将数据及封装数据的方法结合在一起,访问权限用来控制方法或者字段能否直接在类外使用。

范围:

private:同一个包中的同一个类

default:同一个包中的同一个类,同一个包中的不同类(包访问权限,默认 例:成员变量 int a的权限 default)

protected:同一个包中的同一个类,同一个包中的不同类,不同包中的子类

public:公开,同一个包中的同一个类,同一个包中的不同类,不同包中的子类,不同包中的非子类

3.包的概念:把多个类收集在一组

导包:使用import语句导包

4.自定义包:package语句

IDEA:右键src->新建->包(包名) ;右键包名->新建->类(类名 class)

鼠标右键 generate->Getter/Setter自动生成get/set方法;constructor自动生成带参数的构造方法,tostring重写

5.继承:抽取共性,实现代码复用

什么继承? 对共性进行抽取 为什么继承?达到代码的复用

继承之后,子类可以复用父类中成员,子类在实现时只需要关心自己新增加的成员即可;

标识继承关系 要用到 extends关键字

修饰符 class 子类 extends 父类{ }

package demo1;



 class Animal {
    public String name;
    public int age;
    public String color;
    public void eat(){
        System.out.println(name+"正在吃饭!");
    }

}
class Dog extends  Animal{
    public void wangwang(){
        System.out.println(name+"汪汪叫");
    }

}
class Cat extends Animal{
    public  void mimi()
    {
        System.out.println(name+"喵喵喵");
    }
}

public class Test1 {
    public static void main(String[] args) {

        Dog dog=new Dog();
        dog.name="乐乐";
        dog.eat();
        dog.wangwang();
        System.out.println("===========");
        Cat cat =new Cat();
        cat.name="咪咪";
        cat.eat();
        cat.mimi();


    }
}

1)父类成员访问

成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找(访问的成员变量与父类成员变量同名,则有先访问自己的)成员方法同样;

2)super关键字(如何在子类中访问父类相同名称的成员变量?)

直接访问是无法做到的.super关键字的作用就是在子类方法中访问父类的成员,只能在非静态的方法中使用

3)子类构造方法

子类对象构造时,需要先调用基类构造方法,在执行子类的构造方法

因为:子类对象成员是有两部分组成,基类继承下来的以及子类新增加的部分。所以先将基类(父类)继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。

用户没有写时,或父类显式定义无参的构造方法,编译器会自动调用(添加)基类的无参构造方法(super()),而且super()必须是子类构造方法中的第一条语句,并且只能出现一次

如果父类构造方法是有参数的,用户需要为子类显式定义构造方法,并选择合适的父类构造方法调用

public class Base {
    public Base(){
        System.out.println("Base无参构造方法");
    }
}
class Test extends Base{
    public  Test(){
        //默认有Base()
        System.out.println("Test构造方法");
    }
}
class Main{
    public static void main(String[] args) {
        Test test =new Test();
        
    }
}

4)继承方式

JAVA中不支持多继承(一个类继承两个类)

单继承 

多层继承

不同类继承同一个类

6.super 和 this不同点

this是当前对象的引用,super相当于子类对象中从父类继承下来部分成员的引用

this不仅可以访问父类也可以访问子类 super只能访问从父类继承过来的成员变量

7.final关键字:修饰变量,成员,类

1)修饰变量或者字段 表示常量(不能被修改)

2)修饰类表示该类不能被继承

protected关键字

8.组合:类类型来做成员变量

组合和继承类似,也是表达类之间的关系方式

继承 is-a 组合 has-a

9.多态:多种形态

去完成某个行为,不同的对象会产生不同的状态

1)多态的实现条件:

必须要在继承体系下

子类必须要对父类中方法进行重写

向上转型

通过父类的引用调用这个子类重写的方法

体现:在代码运行时,传递不同类对象时,会调用对应类中的方法

 2)重写(覆盖)

重写是子类对父类非静态,非private,final修饰,非构造方法等实现过程进行重新编写,返回值和形参 方法名都不改变;

重写:子类可以根据需要(实现父类的方法),定义特定的属于自己的行为

方法名,参数列表(类型,个数,顺序),返回值必须相同

访问权限不能比父类中被重写的方法访问权限低

可以使用@Override注解显式指定

静态绑定:(前期绑定)在编译时根据用户传递的实参类型确定具体调用哪个方法  (方法的重载是静态绑定,在编译的时候通过方法的参数就能确定调用的是哪个方法)

动态绑定:(后期绑定)在编译时,不能确定方法的行为,需要等程序运行时,才能确定具体调用哪个类的方法

向上转型(有3种方式)

1)直接赋值

创建一个子类对象,将其当成父类对象来使用(小范围向大范围转换)

父类类型 对象名= new 子类类型()

package demo1;



 class Animal {
    public String name;
    public int age;
    public String color;
    public void eat(){
        System.out.println(name+"正在吃饭!");
    }

     public Animal(String name) {
         this.name = name;
     }
 }
class Dog extends  Animal{
     //在子类构造方法之前先调用父类构造方法
     public Dog(String name){
         super(name);
     }

    public void wangwang(){
        System.out.println(name+"汪汪叫");
    }
    public void eat(){
        System.out.println(name+"正在吃狗粮");
    }



}
class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }

    public  void mimi()
    {
        System.out.println(name+"喵喵喵");
    }
    public  void eat(){
        System.out.println(name+"正在吃猫粮");
    }
}

public class Test1 {
    public static void main(String[] args) {

      Animal animal1=new Dog("乐乐");
        animal1.eat();

    }
}

上述通过父类引用调用父类和子类重写的方法就是动态绑定(多态的基础) 

 

2).方法传参 

3)方法返回 

 向上转型的缺点;不能调用子类特有的方法

4)向下转型

将子类对象向上转型之后当成父类方法使用,在无法调用子类方法,有时候需要调用子类特有的方法,再将父类引用还原为子类对象即可,为向下转型

if(animal1 instanceof Cat){
cat=(Cat)animal1;}

要转型为原来的类型,转换失败会抛异常,引入instanceof提高转型的安全性,该表达式为true可以安全转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值