Java面向对象三大特征

封装性

封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。

一,问题的引入:
当我们创建一个类的对象以后,我们可以通过“对象.属性”的方式,对属性进行赋值。这里,赋值操作要受到属性的数据类型和存储范围的制约。除此之外,没有其他的制约条件。但是,在实际问题中,我们往往需要给属性赋值加入额外的限制条件,这个条件就不能在属性声明时体现,我们只能通过方法进行限制条件的增加(比如setLegs)。同时,我们需要避免用户再使用“对象.属性“的方式进行赋值。则需要将属性声明为私有的(private)——此时,针对属性就体现了分装性”
二,封装性的体现:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
拓展:封装性的体现:①不对外暴露的私有方法 ②单例模式
三,封装性的体现,需要权限修饰符来配合:
①Java规定的4种权限(从小到大排列),private,缺省(default),protected,public ②4种权限可以用来修饰及类的内部结构,属性,方法,构造器,内部类
③具体的,4种权限都可以用来修饰类的内部结构,属性,方法,构造器,内部类
修饰类的话:只能使用缺省,public

四,提供关于属性age的get和set方法
    public int getAge(){//有返回值
          return age;
    }
    public void setAge (){//有形参
           age =a ;
    }

继承性

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地
继承父类

一,继承性特点:
1,减少了代码的冗余,提高了代码的复用性
2,便于功能的扩展
3,为之后多态性的使用,提供了前提
二,继承性的格式: class A extends B{}
A:子类,派生类,subclass
B;父类,超类,基类,superclass
体现:2.1,一旦子类A继承父类 B以后,子类A中就继承了父类B声明的结构 ,属性,方法 特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构,只因为封装性的影响,使得子类不能直接不能直接调用父类的结构而已
2.2,子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的的拓展
子类和父类的关系,不同于子类和集合的关系
三:Java中关于继承性的规定:
1,一个类可以被多个子类继承
2,Java的单继承性:一个类只能有一个父类
3,子父类是相对的概念
4,子类直接继承的父类,称为直接父类,间接继承的父类称为:间接父类
5,子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
四:Object类的理解:
1,如果没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类
2,所有的java类(除java.lang.Object类之外)都直接或间接继承于java.lang.Object类
3,意味着,所有的java具有java.lang.Object类声明的功能

多态性

一个事物的多种形态,实现代码的通用性, 声明父类的类型,调用子类的方法

1,对象多态性:父类的引用指向子类的对象或子类的对象赋给父类的引用
2,多态性的使用:
2.1,当调用子父类同名同参数的方法时,实际执行的是子类执行父类的方法…虚拟方法的使用
2.2,有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但是在实际运行期,我们实际执行的是子类重写父类的方法
总结:编译,看左边,运行,看右边
2.3,多态性的使用前提:① 类的继承关系 ②方法的重写
3,多态性的不适应属性:只适应于方法,不适应于属性
4,多态的特点:
4.1, 对象类型和引用类型之间具有继承(类)/实现(接口)的关系;
4.2, 对象类型不可变,引用类型可变;
4.3,引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
4.4,如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。

问题:多态是编译时行为还是运行时行为运行时行为,证明:

package com.milostart.java5;

import java.util.Random;

class Animal {
protected void eat() {
System.out.println(“animal eat food”);
}
public Animal() {

}

}
class Cat extends Animal{
@Override
protected void eat() {
System.out.println(“cat eat fish”);
}
}
class Dog extends Animal {
@Override
protected void eat() {
System.out.println(“dog eat bone”);
}
}
class Sheep extends Animal {
@Override
protected void eat() {
System.out.println(“sheep eat grass”);
}

}

public class InterviewTest {
public static Animal getInstance(int key) {
switch (key) {
case 0:
return new Cat();
case 1:
return new Dog();
default:
return new Sheep();
}
}

public static void main(String[] args) {
	int key = new Random().nextInt(3);
	System.out.println(key);
	Animal animal = getInstance(key);//多态性的体现
	animal.eat();
}

}
运行时行为,只有在程序运行期间,才能确定调用的是哪个类中的方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值