Java面向对象编程语法知识点

本文详细介绍了Java面向对象编程的关键概念,包括封装、继承、super关键字的使用、多态性及其各种表现形式,以及抽象类和接口的定义与应用。通过具体的代码示例,阐述了类之间的is a关系、构造方法的调用顺序、方法重写规则以及向下转型的风险。这些内容对于理解和掌握Java编程至关重要。
摘要由CSDN通过智能技术生成

目录

一、封装

二、继承

1、继承的作用

2.继承的表示方法

3.隐式继承private

4.继承的权限

三、super关键字

1.super修饰属性

2.super修饰构造方法

3.super修饰普通方法和属性

4、final

四、多态

1.向上转型

2.多态的方法重写

4.重写权限

5、向上转型三种发生方式

6.构造方法和多态

7.关于方法的调用

五、向下转型:

1.向下转型风险

六、抽象类

1.Java中定义抽象类规则

七、接口

1.而接口的使用表示两种场景

2.接口表示能力


一、封装

封装: 使用private将属性进行封装(这个属性只在当前类的内部可见,对外部隐藏)

保护性、易用性(通过程序对外提供的方法来操作属性),例如汽车启动,电脑启动等隐藏在内部的过程。

二、继承

1、继承的作用

例子

定义了三个类,Animal类、Cat类、Dog类

public class Animal {
    public String name;
    public void eat(String food){
        System.out.println(this.name + "正在吃" + food);
    }
}
public class Cat {
    public String name;
    public void eat(String food){
        System.out.println(this.name + "正在吃" + food);
    }
}
public class Dog {
    public String name;
    public void eat(String food){
        System.out.println(this.name + "正在吃" + food);
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.name = "动物";
        animal.eat("食物");
        Dog dog  = new  Dog();
        dog.name = "旺财";
        dog.eat("狗粮");
        Cat cat = new Cat();
        cat.name = "小白";
        cat.eat("猫薄荷");
    }
}

 

 不难发现他们都有重复的代码段,按道理说所有Animal的类都应该具备name属性以及eat方法。

所以需要继承来简化代码

当类和类之间满足一个类is a另外一个类,—定是存在继承关系,就像

Dog is an Animal,狗是动物
Cat is an Animal,猫是动物
天然的继承,还有

Bird is an Animal
Duck is an Animal

2.继承的表示方法

子类extends父类

例如上面代码可以简化成一行

public class Cat extends Animal {

}
public class Dog extends Animal {

}

当一个类继承了另一个类,另一个类中所有的属性和方法子类就天然具备了。

注意点,Java不允许多重继承

子类无法继承两个父类,下列代码会报错

public class Cat extends Dog, Animal {

}

但是允许多重继承

多重继承

 bird是Animal的子类,sparrow既是bird也是Animal的子类,extends后面只能跟一个父类。

3.隐式继承private

实际上被继承了,但是无法被子类直接使用

public class Animal {
    public String name;
    private int age;//子类无法通过 . 来直接访问这个属性
    public void eat(String food){
        System.out.println(this.name + "正在吃" + food);
    }
}

 可以通过父类提供的方法

public class Animal {
    public String name;
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class Cat extends Animal {

}

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "小白";
        cat.setAge(3);//此时可直接使用age
        cat.eat("猫薄荷");
    }
}

可见age被cat从Animal继承来了,因为cat类没有定义过任何属性方法,全是extends继承来的。

注意点

静态的属性和方法是归于某个类所有
当一个类继承了另一个类,所有静态属性和方法就继承。
到底能否直接使用,还是要看权限是不是public,如果是private就要通过父类提供的方法使用

总结
a.要能使用继承,前提必须满足类之间的is a关系

b.—个子类只能使用extends继承一个父类。(单继承)
Java中不允许多重继承,extends后面只能跟一个父类,允许多层继承,没法当儿子,可以当孙子。
c.子类会继承父类的所有属性和方法,有两种继承方式

显示继承(public属性和方法可以直接使用)

隐式继承(private属性和方法),子类其实也继承了这个属性和方法,但是无法直接使用。

4.继承的权限

private < default < protected < public

protected访问权限,只在当前类和同包中的不同类中以及不同包中的子类中是可见的

public class Animal {
    //当前类和子类是可见的
    protected String name;
    private int age;
}

不同包中的有继承关系的类可见

package Person;

import Animal.Animal;

public class person extends Animal {
    public void fun(){
        //name属性为protected,不同包中的有继承关系的子类是可见的
        System.out.println(name);
    }
}

注意点

package Person;
public class Test {
    public static void main(String[] args) {
        Person person = new person();
        per.name;
    }

}

 test和Animal没有继承关系,且是person包中,因此name是不可见的

总结

default同包可见 + 其他包中继承关系可见 = protected

三、super关键字

类比于this关键字

this关键字∶表示当前对象的引用
修饰属性,表示直接从当前类中找同名属性

super关键字
修饰属性,表示直接从父类中去寻找同名属性
修饰方法,表示直接从父类中去寻找方法

理解

在认识super前要先知道一个知识

public class Animal {
    //当前类和子类是可见的,对于其他包没有继承关系的类是不可见的
    public Animal(){
        System.out.println("产生父类对象,调用父类构造方法");
    }
}



public class person extends Animal {
    public person(){
        System.out.println("产生子类对象,调用子类对象方法");
    }
}


public class Test {
    public static void main(String[] args) {
    person person = new person();
    }

}

运行结果

 

 当调用new Person无参构造产生子类对象之前,先默认调用父类的构造方法产生父类对象然后才会执行子类的构造方法,产生子类对象。

相关面试题

public class B {
    public B(){
        System.out.println("1.B的构造方法");
    }
    {
        System.out.println("2.B的构造块");
    }
    static{
        System.out.println("3.B的静态方法块");
    }
}



public class C extends B{
    public C(){
        System.out.println("4.C的构造方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值