3.31 权限修饰符、重写、多态、转型、Object、抽象、toString

3.31 权限修饰符、重写、多态、转型、Object、抽象、toString

权限修饰符

​ 被不同权限修饰符修饰的内容能够被使用的范围

本类同包类不同包的子类不同包的其他类
private
default
protected
public

注意:

1)使用最多的private,public

2)这四个修饰符都是成员修饰符,只修饰成员,不能修饰局部

3)在不同包的子类下,若想使用父类中被protected修饰的成员,需要通过继承关系使用,不能通过父类对象使用

重写Override

重写与重载的区别:

重载:1.同一个类的多个方法 2.方法名相同 3.参数列表不同

重写:1.类需要时不同的两个类 2.这两个类需要有继承关系 3.方法签名相同

应用场景:在子类继承父类后,继承了一些功能方法,但对于有些方法的功能不满意,可以进行功能的重写

使用:1.子类方法一旦重写,子类对象调用的时候,会采用就近原则

​ 2.子类对象调用功能的时候,子类存在找子类,子类没有才会找父类

注意:1.子类一旦重写父类的方法,就是对父类方法进行屏蔽

​ 2.可以使用@Override 强制检查该方法是否符合重写规则

​ 3.被private、final、static修饰的方法不能被重写

一个重写的方法要求满足"=="、"<="、">=":

==: 方法签名需要完全相同

<=:返回值若是基本数据类型,则要求数据类型完全相同,若为引用数据类型则要求子类的引用数据类型<=父类的引用数据类型

“>=”:子类方法的权限修饰符>=父类犯法的权限修饰符

多态

​ 多态:一种事物的多种形态

​ 多态的最终体现:父类的引用指向子类的对象

​ 多态的前提:继承|执行

​ 多态的优点:多态可以让程序变得更加灵活,便于后期的维护

​ 当通过父类的引用调用成员方法的时候,如果子类有重写方法就调用重写,如果子类没有重写方法就找父类,如果多态 方法的重写,多态也就没有意义

class Person{}
class Student extends Person{}

Student s = new Student();
//等号左边代表你的外表,等号右边代表你的内在(数据)
Person p = new Student();
//一个学生的内在,外壳是一个人--->多态

Cast 转型

​ 转型:引用类型的类型提升

​ 向上转型 ≈ 自动类型提升—>从小到大—>从子类到父类

​ 向下转型 ≈ 强制类型转换—>从大到小—>从父类到子类—>小范围类型变量 = (小范围类型) 大范围类型的数据

​ 向下转型时可能遇到类型转换异常 ClassCastException,这时需要引用 instanceof 类型 判断前面的引用是否指向后面类 型的对象,或者是否指向后面类型子类的对象,如果是返回true,不是返回false

​ 注意:多态引用不能调用子类中独有的方法,对子类的新增功能不可见,如果要调用子类独有的方法,需要向下转型

Java Object

​ Object类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法

​ Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动 继承 Object,成为 Object 的子类。

​ Object 类可以显示继承,也可以隐式继承

abstract

​ 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个 类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

​ 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

​ 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设 计抽象类。

​ 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

​ 在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

toString

​ 当打印一个对象的引用时,默认会调用toString,打印的时当前对象调用了toString之后的返回值

代码

package homework.circledemo;
/*
1.编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。(7分)
提示:(1)编写一个圆类Circle,该类拥有:
1)	一个成员变量,radius(私有,浮点型);//存放圆的半径;
2)	两个构造方法
Circle()              //将半径设为0
Circle(double  r )    //创建Circle对象时将半径初始化为r
3)	三个成员方法
double getArea()      //获取圆的面积
double getPerimeter()  //获取圆的周长
void show()           //将圆的关径、周长、面积输出到屏幕
		(2) 编写一个圆柱体类Cylinder,它继承于上面的Circle类。还拥有:
1)	一个成员变量,double hight  (私有,浮点型);  //圆柱体的高;
2)	构造方法
//创建Cylinder对象时将半径初始化为r,高度初始化为h
Cylinder(double r,double h)
3)	成员方法
double getVolume()            //获取圆柱体的体积
void showVolume()             //将圆柱体的体积输出到屏幕

 */

public class CircleDemo {
    public static void main(String[] args) {
        Circle circle = new Circle();
        Circle circle1 = new Circle(3.0);
        circle1.show();

        Cylinder cylinder = new Cylinder(2.0,2.0);
        System.out.println("圆柱底面半径为:"+cylinder.getRadius());
        System.out.println("圆柱高为:"+cylinder.getHight());
        System.out.println("圆柱体积为"+cylinder.getVolume());
    }
}

class Circle{
    //半径
    private double radius;

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }


    //构造方法
    public Circle(){
        System.out.println("将半径设为0");
    }
    public Circle(double r){
        this.radius = r;
    }
    //方法
    //面积
    double getArea(double r){
        double area = Math.PI*(r*r);
        return area;
    }
    //周长
    double getPerimeter(double r){
        double perimeter = 2*r*Math.PI;
        return perimeter;
    }
    //将圆的关径、周长、面积输出到屏幕
    void show(){
        System.out.println("该圆的半径为:"+this.radius);
        System.out.println("该圆的为周长:"+this.getPerimeter(this.radius));
        System.out.println("该圆的为面积:"+this.getArea(this.radius));

    }
}

class Cylinder extends Circle{
    public double getHight() {
        return hight;
    }

    public void setHight(double hight) {
        this.hight = hight;
    }

    //高
    private double hight;
    //构造方法
    public Cylinder(double r,double h){
        this.hight = h;
        this.setRadius(r);
    }
    //成员方法
    double getVolume(){
        double volume = Math.PI*this.hight*this.getArea(this.getRadius());
        return volume;
    }
    void showVolume(){
        System.out.println(this.getVolume());
    }
}

package homework.car;
/*
2.	请使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息。
设定
1)	出租车类:
属性包括:车型,车牌,所属出租公司;方法包括:启动,停止
2)	家用轿车类:
属性包括:车型,车牌,车主姓名;方法包括:启动,停止
要求
1)	分析出租车和家用轿车的公共成员,提取出父类—汽车类
2)	利用继承机制,实现出租车类和家用轿车类
3)	编写测试类,分别测试汽车类,出租车类和家用轿车类对象的相关方法
4)	定义名为car的包存放汽车类,出租车类,家用轿车类和测试类
运行效果

 */
public class TaxiAndSedan {
    public static void main(String[] args) {

    }
}
class Car{
    //变量
    public String type;
    public String  num;
    //构造器
    public Car(){}
    //构造器
    public Car(String type,String num){
        this.type = type;
        this.num = num;
    }
    void start(){
        System.out.println("我是车,我启动");
    }
    void stop(){
        System.out.println("我是车,我停下");
        System.out.println("======================");
    }
}
class Taxi extends Car{
    //出租车公司名字
    public String company;
    //构造器
    public Taxi(String company,String num){
        this.company = company;
        super.num = num;
        super.type = type;
    }
    @Override void start(){
        System.out.println("乘客您好");
        System.out.println("我是"+this.company+"出租车公司的,我的车牌是"+this.num+",您要去哪里?");
    }
    @Override void stop(){
        System.out.println("目的地已经到了,请您付费下车,欢迎再次乘坐");
        System.out.println("======================");
    }
}
class Sedan extends Car{
    //车主姓名
    public String name;
    //构造器
    public Sedan(String name){
        this.name = name;
    }
    //方法的重写
    @Override void start(){
        System.out.println("我是"+this.name+"我的汽车我做主");
    }
    @Override void stop(){
        System.out.println("目的地到了,我们去玩吧");
        System.out.println("======================");
    }
}
package homework.car;

public class Test {
    public static void main(String[] args) {
        //汽车测试
        Car car = new Car();
        car.start();
        car.stop();
        //家用轿车测试
        Car sedan = new Sedan("武大郎");
        sedan.start();
        sedan.stop();
        //出租车测试
        Car taxi = new Taxi("景顺","京B123");
        taxi.start();
        taxi.stop();
    }
}


package homework.mon;

public class NewGame {
}

class Monster{
    public String name;
    public int hp;
    public int atk;

    void attack(){
        System.out.println(this.name+"展开攻击");
    }
    void move(){}
    void show(){
        System.out.println(this.name+"展开攻击");
        System.out.println("当前生命值是:"+this.hp);
        System.out.println("攻击力是:"+this.atk);
    }
}

class Snake extends Monster{
    //构造器
    public Snake(String name,int hp,int atk){
        super.hp = hp;
        super.name = name;
        super.atk = atk;
    }
    //方法
    @Override void move(){
        System.out.println("我是蛇怪,我走S型路线");
    }
    int recover(){
        if(this.hp<10){
            this.hp+=20;
        }
        return this.hp;
    }
}

class Centipede extends Monster{
    //构造器
    public Centipede(String name,int hp,int atk){
        super.hp = hp;
        super.name = name;
        super.atk = atk;
    }
    //方法
    @Override void move(){
        System.out.println("我是蜈蚣精,御风飞行");
    }
}

package homework.mon;

import javax.swing.*;

public class Test {
    public static void main(String[] args) {
        Snake snake = new Snake("怪物蛇甲妖",5,20);
        snake.show();
        System.out.println("实施大蛇补血术。。。。。,当前生命值是:"+snake.recover());
        snake.move();
        System.out.println("=====================");

        Centipede centipede = new Centipede("怪物蜈蚣",60,15);
        centipede.show();
        centipede.move();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值