Java复习第三天_面向对象编程

Java面向对象编程的特性

  • 抽象(Abstract)
    简单的说就是想。忽略掉事物的外在,把它最本质的特性提取出来。就比如说人,不管你长得高矮胖瘦,被天使吻过还是被二哈舔过,忽略掉你的外在,提取你拥有的最本质的东西。作为一个人,你有名字、性别、年龄…这些,就是抽象所需要提取的东西。
  • 封装(Encapsulation)
    简单地说就是将属性隐藏,怎么隐藏,使用private修饰符。这样与一般来说外界是获取不到类中的属性了(除非你用反射),然后再根据需求向外界暴露一些获取属性方法。
  • 继承(Inheritance)
    站在巨人的肩膀上,父类有而子类没有的方法可以用父类的,如果子类也有,就用子类的。
  • 多态(polymorphism)
    首先,多态是方法的多态,不是属性的多态;其次,多态要满足3个条件:继承(或实现)、重写父类方法、父类引用指向子类对象。

下面来看看多态

  1. 具体类的多态
class Animal{
    public void eat(){
        System.out.println("动物吃XX");
    }

    public static void sleep(){
        System.out.println("动物睡觉");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public static void sleep(){
        System.out.println("猫睡觉");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

public static void main(String[] args){
		Animal a1 = new Cat();
        Animal a2 = new Dog();
        a1.eat();
        a1.sleep(); //静态方法不能被重写,所以调用的是父类的sleep方法
        a2.eat();
}

结果:
猫吃鱼
动物睡觉
狗吃肉
  1. 抽象类的多态
abstract class Wine{
    void type(){
        System.out.println("酒");
    }
}

class NuoMi extends Wine{
    @Override
    void type() {
        System.out.println("糯米酒");
    }
}

class YangMei extends Wine{
    @Override
    void type() {
        System.out.println("杨梅酒");
    }
}

public static void main(String[] args){
		Wine w1 = new NuoMi();
        Wine w2 = new YangMei();
        w1.type();
        w2.type();
}

结果:
糯米酒
杨梅酒
  1. 接口的多态
interface Person{
    void say();
    
    static void anyway(){
        System.out.println("诶嘿嘿");
    }
}

class Teacher implements Person{
    @Override
    public void say() {
        System.out.println("老师教书");
    }


    public void anyway() {
        System.out.println("老师诶嘿嘿");
    }
}

class Student implements Person{
    @Override
    public void say() {
        System.out.println("学生回答问题");
    }
}

public static void main(String[] args){
		Person p1 = new Teacher();
        Person p2 = new Student();
        p1.say();
//        p1.anyway();  //接口中的静态方法只能通过类名调用,不能通过父类引用调用。
						//因为静态方法不能被重写,而且接口没有实例,所以只能通过类名调用
        p2.say();
}

结果:
老师教书
学生回答问题

重写和重载的区别

ok,说到重写。咱们来对比一下重写和重载。

  • 重写:
    1.方法名相同,参数列表相同
    2.返回类型相同或是原返回类型的子类型
    3.访问范围不能被缩小
    4.异常不能被扩大
  • 重载:
    方法名相同,参数列表不同,其他随意。

类的初始化顺序

java类初始化顺序

  • 普通类:
    1.静态属性
    2.静态代码块
    3.普通属性
    4.普通代码块
    5.构造函数

  • 继承的子类:
    1.父类静态属性
    2.父类静态代码块
    3.子类静态属性
    4.子类静态代码块
    5.父类普通属性
    6.父类普通代码块
    7.父类构造函数
    8.子类普通属性
    9.子类普通代码块
    10.子类构造函数
    ps:可以这么记:父父子子,父父父子子子

    注:静态代码块只执行一次,构造器和普通代码块每new一次执行一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值