首页 > 编程语言 >Java基础入门day19

Java基础入门day19

时间:2024-03-23 10:02:09浏览次数:34  
标签:Java 入门 age System public println sex day19 out

day19

面向对象的三大特性

三大特性

  • 封装

  • 继承

  • 多态

封装

package com.saas;
​
public class Student {
​
    String name;
    int age;
    double score;
    boolean sex;
}
package com.saas;
​
public class TestEncapsulation {
​
    public static void main(String[] args) {
        Student s = new Student();
​
        s.name = "bajie";
        s.age = 2000;
        s.sex = true;
        s.score = -59;
​
        System.out.println(s.name);
        System.out.println(s.sex);
        System.out.println(s.age);
        System.out.println(s.score);
    }
}

最终的运行结果:

bajie
true
2000
-59.0

在对象的外部,为对象的属性赋值,可能会存在非法数据的录入

就目前的技术而言,并没有办法对于属性的赋值加以控制

上面的案例中成绩给的值是-59,而且最终也成功打印出来,但是大家这个是不合法的数据

封装就可以解决这样的问题

封装的现实生活中的案例比如“胶囊”, 比如发动机不允许随便的给用户暴露接口

概念:尽可能的隐藏对象的内部实现细节, 控制对象的修改以及访问权限

访问修饰符: private,私有的,意思是只有当前类可以访问的成员,仅本类可见

package com.saas;
​
public class Student02 {
​
    private String name;
    private int age;
    private double score;
    private boolean sex;
​
    public void sayHi(){
        System.out.println("name: \t"  + name);
        System.out.println("age: \t"  + age);
        System.out.println("sex: \t"  + sex);
        System.out.println("score: \t"  + score);
    }
}
package com.saas;
​
public class TestEncapsulation02 {
​
    public static void main(String[] args) {
        Student02 s = new Student02();
​
        s.name = "bajie";       //  此处会出现编译报错,因为name是Student02类中的私有成员,只有在Student02类的内部可以访问,在Student02类以外的其他类都无法访问Student类中的私有成员
        s.age = 2000;
        s.sex = true;
        s.score = -59;
​
        System.out.println(s.name);
        System.out.println(s.sex);
        System.out.println(s.age);
        System.out.println(s.score);
    }
}

这个代码在编译时就出现了编译报错

因为name,age,sex,score在Student类中被定义为private私有的访问权限

private私有访问权限的意思是只有在当前类Student02类中可以被访问,

一旦跳出Student02类之后,其他类中是无法访问Student02类中的私有成员的

在此我们说编译错误其实是对于我们程序的一种保护

但是目前程序有一个问题,即使合法值也无法进行赋值操作

package com.saas;
​
public class Student03 {
​
    private String name;
    private int age;
    private double score;
    private boolean sex;
​
    public void setScore(double score){
​
        if(score > 100 || score < 0){
            System.out.println("请输入合法的成绩值:(0-100)");
            score = 0;
        }
​
        this.score = score;
    }
​
    public double getScore(){
        return score;
    }
​
    public void sayHi(){
        System.out.println("name: \t"  + name);
        System.out.println("age: \t"  + age);
        System.out.println("sex: \t"  + sex);
        System.out.println("score: \t"  + score);
    }
}
package com.saas;
​
public class TestEncapsulation03 {
​
    public static void main(String[] args) {
        Student03 s = new Student03();
​
        s.setScore(-99);
​
        System.out.println(s.getScore());
    }
}

以上程序我们可以看出,虽然继续保持了属性的私有化,但是同时提供了一对儿public的set和get方法

setXxx方法可以实现给对应的属性赋值

getXxx方法可以实现获取对应的属性值

但是由于setXxx是一个方法,我们可以在方法内部加一些非法数据的判断 和处理,使得非法值无法实现赋值,并给与用于以有好的提示

对于成绩而言,合法值的取值范围是(0-100),正常范围内的值,可以直接赋值

而对于非法值赋值会有额外的错误提示并给与默认处理值,使得程序对于正确值和非法值都可以进行相应的处理

这个setXxx被称之为setter,getXxx方法被称之为getter

命名规则为setXxx()以及getXxx

对于boolean类型的getter而言,标准的写法应该是isXxx, sex是boolean类型的属性,所以其标准版的getter是isSex

最终封装的实现步骤:

先将属性私有化,使用private来修饰

再给该属性提供共有的setter和getter

在setter中可以使用判断来实现对于非法值恶意值的屏蔽与过滤

封装的好处:可以提高程序的安全性

缺点:大大增加了代码量

package com.saas;
​
public class Teacher {
​
    private String name;
    private String major;
    private int age;
    private boolean sex;
​
    public boolean isSex() {
        return sex;
    }
​
    public void setSex(boolean sex) {
        this.sex = sex;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getMajor() {
        return major;
    }
​
    public void setMajor(String major) {
        this.major = major;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
​
        if(age < 26){
            System.out.println("年龄必须大于等于26岁");
            age = 26;
        }
​
        this.age = age;
    }
}
package com.saas;
​
public class TestEncapsulation04 {
​
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
​
        t1.setName("wukong");
        t1.setAge(500);
        t1.setMajor("computer");
        t1.setSex(true);
​
        System.out.println(t1.getName());
        System.out.println(t1.getAge());
        System.out.println(t1.getMajor());
        System.out.println(t1.isSex());
​
        System.out.println("========================");
​
        Teacher t2 = new Teacher();
​
        t2.setName("honghaier");
        t2.setAge(12);
        t2.setMajor("shaohuo");
        t2.setSex(true);
​
        System.out.println(t2.getName());
        System.out.println(t2.getAge());
        System.out.println(t2.getMajor());
        System.out.println(t2.isSex());
    }
}

当年龄小于26岁时,这是一个非法值,在setter方法内部,对于这些非法的值进行屏蔽与过滤

访问修饰符

public:公共的,在同一个项目中,都可以被访问的资源

protected:受保护的,在同包或者不同包的子类可以被访问

default:默认值,只在同包下的资源可以访问

private:私有的,只有自己能够访问的资源

继承

“子承父业”,老爸有的,子类可以无需做任何事情,可以得到父类的资源

生活中的继承,是施方的一种赠与,受方的一种获取,将一方所拥有的东西给予另一方,一般来说双方具备一种继承关系(直系,亲属)

程序中的继承, 是类与类之间的特征和行为赠与或者获得

一般来说两个类之间要具备一个“is a”的关系

现实生活中,很多类之间都存在继承关系,都满足“is a”的关系

狗是一种动物,狗是一种生物,狗是一种物质

package com.saas;
​
public class Animal {
​
    String breed;
​
    int age;
​
    boolean sex;
​
    public void eat(){
        System.out.println("eatting...");
    }
​
    public void sleep(){
        System.out.println("sleeping...");
        System.out.println("zzzZZZ");
    }
}
package com.saas;
​
/**
 * Dog继承自Animal
 * 则在dog内部无需重复定义父类的成员而直接使用
 */
public class Dog extends Animal {
​
    public void run(){
        System.out.println("running...");
    }
}
package com.saas;
​
public class TestExtends01 {
​
    public static void main(String[] args) {
        Animal a = new Animal();
​
        a.breed = "dog";
        a.age = 5;
        a.sex = true;
​
        System.out.println("breed:\t" + a.breed);
        System.out.println("age:\t" + a.age);
        System.out.println("sex:\t" + a.sex);
​
        a.eat();
        a.sleep();
​
        System.out.println("=====================");
​
        Dog xiaohei = new Dog();
​
        xiaohei.breed = "中华田园犬";
        xiaohei.sex = false;
        xiaohei.age = 3;
​
        System.out.println("breed:\t" + xiaohei.breed);
        System.out.println("age:\t" + xiaohei.age);
        System.out.println("sex:\t" + (xiaohei.sex ? "公": "母"));
​
        xiaohei.eat();
        xiaohei.sleep();
        xiaohei.run();
    }
}

语法:class子类extends 父类{} // 定义子类时,显式继承父类

应用:产生继承关系之后,子类可以使用父类中的属性和方法

好处: 既提高代码的可读性,又提高了代码的可扩展性

package com.saas.oo;
​
public class Teacher {
​
    String name;
    int age;
    String major;
    public  void introduce(){
        System.out.println("name:\t" + name);
        System.out.println("age:\t" + age);
        System.out.println("major\t"+  major);
    }
​
    public void giveLesson(){
        System.out.println("知识点回顾");
        System.out.println("知识点讲解");
        System.out.println("知识点总结");
    }
}
package com.saas.oo;
​
public class JavaTeacher extends  Teacher{
​
    @Override
    public void giveLesson() {
        System.out.println("打开idea");
        super.giveLesson();
    }
}
​
package com.saas.oo;
​
public class TestExtends02 {
​
    public static void main(String[] args) {
        Teacher t1 = new Teacher();
​
        t1.major = "computer";
        t1.age = 20;
        t1.name = "zhangsan";
​
        t1.introduce();
        System.out.println("------------------");
        t1.giveLesson();
​
        System.out.println("-=================");
​
        JavaTeacher t2 = new JavaTeacher();
​
        t2.major = "computer";
        t2.age = 26;
        t2.name = "zhangsan";
​
        t2.introduce();
        System.out.println("------------------");
        t2.giveLesson();
        System.out.println("-=================");
    }
}

此案例中Teacher类中定义三个属性,两个方法,可以直接使用

JavaTeacher继承自Teacher类,所以Teacher类中无需做额外的定义,即可拿到JavaTeacher的这三个属性和这两个方法

Java中使用extends代表一种继承关系,class 子类 extends 父类

继承的好处:大大节省了代码量

继承的缺点:必须得有对应的继承关系

标签:Java,入门,age,System,public,println,sex,day19,out
From: https://blog.csdn.net/zpz2001/article/details/136910955

相关文章

  • python3最全知识点,从入门到开车就是这么简单(建议收藏)
    前言:此文是自己学习python过程中的笔记和总结.适合有语言基础的人快速了解python3和没基础的作为学习的大纲了解学习的方向、知识点;笔记是从多本书和视频上学习后的整合版。(一)初识python1、一般文件以.py为格式;用#作注释.2、一般对象不用特别声明,python会自动识别;一......
  • Java面向对象编程面试题
    序号问题详细答案1什么是类与对象?类和对象实例之间的关系?   类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象,对象是类的实例化;类是静态的,对象是动态的,对象可以看作是运行中的类。类负责产生对象,可以将类当成生产对象的工厂2构造函数的特点有哪些(1......
  • [附源码]JAVA计算机毕业设计车辆维修管理系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着汽车行业的迅猛发展,车辆数量不断增加,车辆维修管理已成为一个亟待解决的问题。传统的车辆维修管理方式往往依赖于纸质记录和人工操作,效率低下且容......
  • [附源码]JAVA计算机毕业设计车辆理赔系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着汽车产业的快速发展,车辆保险业务逐渐成为保险公司的重要收入来源。然而,传统的车辆理赔流程繁琐,效率低下,难以满足现代快节奏生活的需求。因此,开发......
  • [附源码]JAVA计算机毕业设计安卓装维助手APP(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已经成为人们生活中不可或缺的一部分。在信息化社会的大背景下,各行各业的信息化水平也在不断提升。其中,计算机......
  • [附源码]JAVA计算机毕业设计安卓智能手机个性化定制问卷调查平台app(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网的迅猛发展,智能手机已成为人们日常生活中不可或缺的一部分。在个性化消费趋势的推动下,用户对智能手机的个性化定制需求日益增长。然而......
  • Java回溯知识点(含面试大厂题和源码)
    回溯算法是一种通过遍历所有可能的候选解来寻找所有解的算法,如果候选解被确认不是一个解(或至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃这个解,即“回溯”并尝试另一个候选解。回溯法通常用递归方法来实现,在解决排列、组合、选择问题时非常有效。回溯算法的......
  • Java的编码、消息摘要、数字签名、加密(推荐)
    Java中,编码和加密是两个不同的概率,分别作用于不同的目标。我们在日常开发中偶尔也会用到关于这两个东西,比如对数据加密,账号密码进行加密等情况,下面我围绕Java的编码和加密进行相关介绍和讲解。Java编码编码作为Java中将数据转换为另一种格式的过程,通常是用于数据的传输和......
  • Java之类和对象(精简版-更适合复习)
    什么是类?描述一个对象的。什么是对象?真正的一个实体。类和对象就是为了进行面向对象编程。//定义类classStudent//类名大驼峰{}每一个类都可以有main方法类如何产生对象呢?通过new关键字实例化对象。可以实例化多个对象,但不能有无限个,因为堆有大小,内存有限。......
  • djangoJAVA汽车年审管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着汽车产业的快速发展,汽车已经成为人们日常生活中不可或缺的交通工具。然而,随着汽车数量的增加,汽车安全问题也日益凸显。为了确保道路交通安全,各国政府都......