Java面向对象(三)

    一、封装:

一般意义的封装:把一段重复代码抽取成一个函数,称为代码的封装(包装)
    面向对象语言的封装:将类的某些信息隐藏在类的内部(通过使用不同的访问权限修饰符),不许外部程序直接访问
而是通过该类提供的方法来实现对隐藏信息的操作和访问

    封装案例1:将成员变量私有化
    封装案例2:将成员方法私有化
java固定模式:解决某种问题的固定方式(算法)
    单例模式:让一个类在一个程序中只能创建一个对象(window_TestWindow)
            将类的构造方法私有化,外界不可以随便调用,向外界提供一个方法去构建
            在类中new一个static的自己,保证在类生成时,就生成了唯一的对象

    补充变量的分类:
    1、数据类型:基本数据类型、引用数据类型
    2、按照位置分:
            成员变量:在定义类中,可以使用权限修饰符修饰;
                    在构造方法中进行自动赋值;
                    生命周期不同:静态(随着类的加载而生成,类的销毁而销毁)
                               非静态(随着对象的创建,销毁而创建销毁)
                    存储位置:
                            静态:方法区
                            非静态:堆
            局部变量:在定义方法中,不能使用权限修饰符修饰
                    必须自己进行初始化
                    生命周期:随着方法调用而生成,方法调用结束而结束
                    存储位置:栈

例:

package com.wbc.opp.oop.day3.packAge;

public class Person {
    private String name;//私人权限
    private int age;//私人权限

    //定义公共的成员方法,可以在此类方法中加入控制语句
    // 外界通过调用方法来访问成员变量

    public Person(){

    }
    //通过构造方法
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }


    public void setName(String name){
        if(name.length()>2&&name.length()<6){
            this.name=name;
        }
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        if(age<150&&age>0){
            this.age=age;
        }
    }
    public int getAge(){
        return this.age;
    }
}

package com.wbc.opp.oop.day3.packAge;

public class TestPerson {
    public static void main(String[] args) {
        Person p1=new Person();
        /*
        String name;在其他类中可以直接对类中的属性进行赋值操作,但没法控制其赋值的内容
        p1.name="sdadsa";
         */
        p1.setName("abac");
        String p1Name= p1.getName();
        System.out.println(p1Name);
        p1.setAge(2);
        int p1Age=p1.getAge();
        System.out.println(p1Age);
    }
}

二、继承

继承就是将同一类事物中的共性进行抽取,定义在一个类中(基类)
其他类可以继承基类,就能拥有基类中的功能,实现代码的复用类
以及可以在子类中扩展属于子类自己的功能而不影响其他类

例:猫狗都是动物,所以可以抽取一个动物类,以继承功能

优点:提高了代码的重复率,减少了冗余。

子类使用extends关键字继承父类
一个类只能继承一个类,但可以多层继承(继承体系)

Object是所有类的父类,是java类体系中最顶尖的类
当一个类没有显示继承,默认继承Object

dog继承Animal,Dog称为子类,派生类;Animal成为父类

方法覆盖:可能有些功能比较笼统或者与具体有差距,需要更加细致的功能。
        所以出现了方法的覆盖
        当父类中方法的实现不能满足子类需求是,可以在子类中对父类的方法进行覆盖
        要求:子类重写的方法结构与父类方法结构一致(权限大于等于父类权限;返回值,名字,参数必须一致)
             父类的私有方法不能重写,挎包的默认权限方法不能重写
             子类抛出的异常不能大于父类的异常
@Override//注解标签。表示此方法是从父类重写来的,检查重写是不是正确
可以不用添加,只需要重写正确即可,但建议保留(编译器可以进行语法验证;增加可读性)

super关键字:当覆写后子类需要调用父类的方法,可以用super关键字调用
例如
      
@Override
      public void sleep() {
          super.sleep();//使用super调用父类方法
          System.out.println("哮天犬不需要睡觉");
      }
super不仅可以调用父类,还可以调用父类的父类
super与this相似,this表示当前的对象,super代表父类的内存空间的标识
this在用的时候需要创建本类对象,但super没有创建父类对象,只是将父类的信息存入子类

继承中的构造方法:
    在子类继承父类时不会继承构造方法,只能通过super构造
    在子类的构造方法首行调用父类的构造方法-> super(无参调无参,有参调有参);
    不写会默认无参构造(super();)

    常见错误:默认无参构造时,父类需要有无参构造方法

例:

Animal是父类

package com.wbc.opp.oop.day3.inherit;

public class Animal {
    private String breed;//品种
    private String name;
    private int age;
    private String gender;

    public String getBreed() {
        return breed;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void printInfo(){
        System.out.println("姓名:"+name);
        System.out.println("品种:"+breed);
        System.out.println("性别:"+gender);
        System.out.println("年龄"+age);
    }

    public Animal() {
    }

    public Animal(String name, int age, String gender,String breed) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.breed=breed;
    }

    public void sleep(){
        System.out.println(breed+":"+name+"正在睡觉");
    }
    public void eat(String food){
        System.out.println(breed+":"+name+"正在吃"+food);
    }
}

cat是子类之一  

package com.wbc.opp.oop.day3.inherit;

public class Cat extends Animal{
    public void catchMice(){
        System.out.println(getName()+":正在抓老鼠");
    }
}
package com.wbc.opp.oop.day3.inherit;

public class TestCat {
    public static void main(String[] args) {
        Cat cat=new Cat();
        cat.setName("Tom");
        cat.setBreed("抓老鼠的猫");
        cat.setGender("公");
        cat.setAge(6);
        cat.catchMice();
        cat.printInfo();
    }
}

dog是另一子类 

package com.wbc.opp.oop.day3.inherit;

public class Dog extends Animal {

    public void lookHouse(){
        System.out.println(getName()+":正在看家");
    }
    @Override//注解标签。表示此方法是从父类重写来的,检查重写是不是正确
    public void sleep(){
        System.out.println("狗在睡觉");
    }
}
package com.wbc.opp.oop.day3.inherit;

public class TestDog {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.setName("viky");
        dog.setBreed("泰迪");
        dog.setGender("母");
        dog.setAge(6);
        dog.lookHouse();
        dog.printInfo();
        dog.eat("狗粮");
    }
}

哮天犬又是dog的子类

package com.wbc.opp.oop.day3.inherit;

public class Xtd extends Dog{

    public void fly(){
        System.out.println("哮天犬可以飞");
    }

    //可以左键快速重写
    @Override
    public void sleep() {
        super.sleep();//使用super调用父类方法
        System.out.println("哮天犬不需要睡觉");
    }

}
package com.wbc.opp.oop.day3.inherit;

public class TestXtq {
    public static void main(String[] args) {
        Xtd xtd=new Xtd();
        xtd.setName("哮天犬");
    }
}

三、抽象类

抽象方法:只有方法声明,没有具体实现的方法
why要有抽象方法:在一些体系结构的顶端类中,有些功能没必要实现
              因为在不同子类中的实现都不相同,这时候就可以将方法声明为抽线方法
              public abstract void eat(); //定义为抽象方法,没有具体实现,不完整
              此时需要将类定义成抽象类
              public abstract class Animal {//将类使用abstract抽象化
              使用abstract关键字修饰的类就是抽象类。
              若一个类中有抽象方法,则其必须是抽象类。
              但抽象类中也可以有非抽象方法
抽象类:一个类中有不完整的方法,则这个类是抽象类
      特点:除了其不可构造对象外,其他功能与其他正常的类都相同,可以有变量,方法,构造器
           其子类必须重写其所有抽象方法,或者也定义为抽象类
      作用:主要在上层定义功能,让子类继承实现
      语法:public abstract class Animal {//将类使用abstract抽象化

例:

父类Animal(抽象类)——》子类 cat(抽象类)

                                    ——》另一子类 dog(非抽象)

package com.wbc.opp.oop.day3.Abstract;

public abstract class Animal {//将类使用abstract抽象化
    private String name;
    private int age;
    public abstract void eat(String food); //定义为抽象方法
    public Animal(){

    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void printINfo(){
        System.out.println(name+"\t"+age);
    }
}

 

package com.wbc.opp.oop.day3.Abstract;

public abstract class cat extends Animal {//定义为抽象类
}
package com.wbc.opp.oop.day3.Abstract;

public class Dog extends Animal{
    public Dog() {

    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat(String food) {//重写实现
        System.out.println(getName()+"吃"+food);
    }
}
package com.wbc.opp.oop.day3.Abstract;

public class TestDog {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.setName("旺财");
        dog.setAge(10);
        dog.printINfo();
        dog.eat("狗粮");
    }
}

四、练习

1.求学生平均成绩 编写出一个通用的人员类(Person),该类具有姓名(Name)、年龄(Age)、性别(gender)等。 然后对Person类的继承得到一个学生类(Student), 该类能够存放学生的5门课的成绩(语文,数学,英语,物理,地理),并有一个方法能求出平均成绩。 最后在main函数中对Student类的功能进行验证。

//person类
package com.wbc.opp.oop.homework.day3.gradeAverage;

public  class Person {
    private String Name;
    private int Age;
    private String gender;

    public Person(String name, int age, String gender) {
        Name = name;
        Age = age;
        this.gender = gender;
    }

    public Person() {

    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getAge() {
        return Age;
    }

    public void setAge(int age) {
        Age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }


}
//student类
package com.wbc.opp.oop.homework.day3.gradeAverage;

public class Student extends Person {
    private double gradeAverage;
    private double chnAverage;
    private double mathAverage;
    private double engAverage;
    private double phyAverage;
    private double geoAverage;
    public Student() {
        super();
    }

    private Student(String name, int age, String gender) {
        super(name, age, gender);

    }

    private void setChnAverage(double chnAverage) {
        this.chnAverage = chnAverage;
    }

    private void setMathAverage(double mathAverage) {
        this.mathAverage = mathAverage;
    }

    private void setEngAverage(double engAverage) {
        this.engAverage = engAverage;
    }

    private void setPhyAverage(double phyAverage) {
        this.phyAverage = phyAverage;
    }

    private void setGeoAverage(double geoAverage) {
        this.geoAverage = geoAverage;
    }

    public void setAllAverage(double chnAverage,double mathAverage,double engAverage,double phyAverage,double geoAverage){
        setChnAverage(chnAverage);
        setMathAverage(mathAverage);
        setEngAverage(engAverage);
        setPhyAverage(phyAverage);
        setGeoAverage(geoAverage);
    }

    public void printInfo(){
        System.out.println("语文:"+chnAverage);
        System.out.println("数学:"+mathAverage);
        System.out.println("英语:"+engAverage);
        System.out.println("物理:"+phyAverage);
        System.out.println("地理:"+geoAverage);
    }
    public double grade(){
        return (chnAverage+mathAverage+engAverage+phyAverage+geoAverage)/5;
    }
}
//测试类
package com.wbc.opp.oop.homework.day3.gradeAverage;

public class TestStudent {
    public static void main(String[] args) {
        Student stu=new Student();
        stu.setAllAverage(1,2,3,4,5);
        stu.printInfo();
        System.out.println("平均成绩为:"+stu.grade());
    }
}

 

2.人类设计 定义一个人类,包括属性:姓名、性别、年龄、国籍;包括方法:吃饭、睡觉,工作。 (1)根据人类,派生一个学生类,增加属性:学校、学号;重写工作方法(学生的工作是学习)。 (2)根据人类,派生一个工人类,增加属性:单位、工龄;重写工作方法(工人的工作是……自己想吧)。 (3)根据学生类,派生一个学生干部类,增加属性:职务;增加方法:开会。

//Person类
package com.wbc.opp.oop.homework.day3.human;

public abstract class Person {
    private String name;
    private String gender;
    private int age;
    private String country;

    public Person() {
    }

    public Person(String name, String gender, int age, String country) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.country = country;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
    public void setAllInfo(){
        System.out.println(name);
        System.out.println(gender);
        System.out.println(age);
        System.out.println(country);;
    }

    public void eat(){
        System.out.println(getName()+"吃饭");
    }
    public void sleep(){
        System.out.println(getName()+"睡觉");
    }
    public abstract void work();
}
//Student类
package com.wbc.opp.oop.homework.day3.human;

public class Student extends Person{
    private String school;
    private String stuNums;

    public Student() {
    }

    public Student(String name,
                   String gender,
                   int age,
                   String country,
                   String school,
                   String stuNums) {
        super(name, gender, age, country);
        this.school = school;
        this.stuNums = stuNums;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    public String getStuNums() {
        return stuNums;
    }

    public void setStuNums(String stuNums) {
        this.stuNums = stuNums;
    }

    public void getAllInfo(){
        System.out.println(getName());
        System.out.println(getGender());
        System.out.println(getAge());
        System.out.println(getCountry());
        System.out.println(school);
        System.out.println(stuNums);
    }
    @Override
    public void work() {
        System.out.println(getName()+"学习");
    }
}
//ITworker类
package com.wbc.opp.oop.homework.day3.human;

public class ITworker extends Person{
    private String unit;
    private int workAge;

    public ITworker() {

    }

    public ITworker(String name, String gender, int age, String country, String unit, int workAge) {
        super(name, gender, age, country);
        this.unit = unit;
        this.workAge = workAge;
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }

    public int getWorkAge() {
        return workAge;
    }

    public void setWorkAge(int workAge) {
        this.workAge = workAge;
    }
    public void setAllInfo(String unit,int workAge){
        setUnit(unit);
        setWorkAge(workAge);
    }


    public void getAllInfo(){
        System.out.println(getName());
        System.out.println(getGender());
        System.out.println(getAge());
        System.out.println(getCountry());
        System.out.println(unit);
        System.out.println(workAge);
    }

    @Override
    public void work() {
        System.out.println(getName()+"正在赛博板砖");
    }
}
//Stucadre学生干部类
package com.wbc.opp.oop.homework.day3.human;

public class StuCadre extends Student{
    private String post;

    public StuCadre() {
    }

    public StuCadre(String name, String gender, int age, String country, String school, String stuNums, String post) {
        super(name, gender, age, country, school, stuNums);
        this.post = post;
    }
    public void getAllInfo(){
        System.out.println(getName());
        System.out.println(getGender());
        System.out.println(getAge());
        System.out.println(getCountry());
        System.out.println(getSchool());
        System.out.println(getStuNums());
        System.out.println(post);
    }
    public void meeting(){
        System.out.println(post+getName()+"正在开会");
    }
}
//test类
package com.wbc.opp.oop.homework.day3.human;

public class Test {


    public static void main(String[] args) {
        Student stu =new Student("wang","男",20,"中国","snut","0001");
        stu.work();
        stu.eat();
        stu.sleep();
        stu.getAllInfo();


        ITworker worker =new ITworker("wang","男",20,"中国","非凡",1);
        worker.work();
        worker.getAllInfo();


        StuCadre cadre=new StuCadre("wang","男",20,"中国","snut","0001","学生会主席");
        cadre.work();
        cadre.getAllInfo();
        cadre.meeting();

    }
}

3、定义一个人类 , 包含一个country属性,speak(),eat()方法 派生一个中国人和美国人类, 两种人说话方式语言不同, 两种人吃饭方式不同

//person类
package com.wbc.opp.oop.homework.day3.personCountry;

public abstract class Person {
    private String country;

    public Person(String country) {
        this.country = country;
    }

    public Person() {
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
    public abstract void speak();
    public abstract void eat();
}
//Chinese类
package com.wbc.opp.oop.homework.day3.personCountry;

public class Chinese extends Person{
    public Chinese(String country) {
        super(country);
    }

    @Override
    public void speak() {
        System.out.println(getCountry()+"人说中文");
    }

    @Override
    public void eat() {
        System.out.println(getCountry()+"人吃中餐");
    }
}
//American类
package com.wbc.opp.oop.homework.day3.personCountry;

public class American extends Person{
    public American(String country) {
        super(country);
    }

    @Override
    public void speak() {
        System.out.println(getCountry()+"人说鸟语");
    }

    @Override
    public void eat() {
        System.out.println(getCountry()+"人吃西餐");
    }
}
//test类
package com.wbc.opp.oop.homework.day3.personCountry;

public class Test {


    public static void main(String[] args) {
        Chinese chinese=new Chinese("中国");
        chinese.eat();
        chinese.speak();

        American american=new American("美国");
        american.eat();
        american.speak();
    }
}

4.学生信息管理系统 设计一个学生信息管理系统,有添加学生,查询学生,删除学生等功能. 要求:1.设计一个类学生类,学生属性有学号,姓名,性别(属性私有权限) 用来存储学生的信息 要求2:实现对学生信息的增删查操作 要求3:使用一个数组存储学生信息,数组上限定为30即可.

启动程序后输出一个菜单让用户选择操作:1.添加学生,2-删除学生,3.查询学生,4-退出
选择添加学生在控制台依次输入学号,姓名,性别等信息,将学生信息存储到一个学生对象中,
并将学生对象存储到数组中,数组容量定为30.
删除时,必须输入学号,如果学号对应的学生存在,从数组中删除该学生信息
点击查询时,必须输入学号,如果学号对应的学生存在,输出学生信息即可,不存在,输出学号有误

//Student类
package com.wbc.opp.oop.homework.day3.studentInformationManagementSystem;

/*
   学生类,主要作用,存储学生信息
 */
public class Student {


      private int num;
      private String name;
      private String gender;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }



    @Override
    public String toString() {
        return "Student{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}
//StudentManage类
package com.wbc.opp.oop.homework.day3.studentInformationManagementSystem;

import java.util.Scanner;

/*
   学生信息管理类
   在此类中,可以有添加,删除,查询学生信息等功能
 */
public class StudentManage {


        Student[] students = new Student[30];//[null,null,null]
        static int count=0;
        /*
           管理系统主方法
         */
         public void menu(){
               loop:while(true){
                     System.out.println("用户选择操作: 1.添加学生,2-删除学生,3.查询学生,4-退出");
                     Scanner s = new Scanner(System.in);
                     int item = s.nextInt();
                     switch (item){
                         case 1: this.add(); break;
                         case 2: this.delete(); break;
                         case 3: this.search(); break;
                         case 4:  break loop;
                     }
                 }
         }
    /*
  添加
*/
    public void add() {
        Student stu = new Student();
        Scanner name = new Scanner(System.in);
        System.out.println("请输入姓名");
        String names = name.next();
        stu.setName(names);
        Scanner num = new Scanner(System.in);
        System.out.println("请输入学号");
        int nums = num.nextInt();
        stu.setNum(nums);
        Scanner gender = new Scanner(System.in);
        System.out.println("请输入性别");
        String genders = gender.next();
        stu.setGender(genders);

        for (int i = 0; i < students.length; i++) {
            if (students[i] == null) {
                students[i] = stu;
                count++;
                break;
            }
        }
        System.out.println("添加成功");
    }

    /*
      删除
     */
    public void delete() {
        System.out.println("请输入学生学号");
        Scanner num = new Scanner(System.in);
        int nums = num.nextInt();
        for (int i = 0; i < students.length; i++) {
            if (students[i] != null && students[i].getNum() == nums) {
                for (int j = i; j < students.length - 1; j++) {
                    students[j] = students[j + 1];
                }
                count--;
                System.out.println("删除成功");
                return;
            }
        }
        System.out.println("查无此人");
    }

    /*
      查询
     */
    public void search() {
        System.out.println("请输入学生学号");
        Scanner num = new Scanner(System.in);
        int nums = num.nextInt();
        for (int i = 0; i < students.length; i++) {
            if (students[i] != null && students[i].getNum() == nums) {
                System.out.println(students[i].toString());
                return;
            }
        }
        System.out.println("查无此人");
    }



}
//RunStudentManage类
package com.wbc.opp.oop.homework.day3.studentInformationManagementSystem;

/*
   启动类
 */
public class RunStudentManage {

    public static void main(String[] args) {
         /*
          创建一个学生信息管理系统对象
          */
        StudentManage studentManager = new StudentManage();
        studentManager.menu();
 



    }
}

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京最后的深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值