zoukankan      html  css  js  c++  java
  • java封装继承以及多态(含代码)

    封装

    • 该露的露,该藏的藏
      • 我们程序设计要追求,“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成。不允许外部干涉;低耦合:仅暴漏少量的方法给外部使用。
    • 封装(数据的隐藏)
      • 通常,应禁止访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
    • 记住这句话就够了:属性私有,get/set
    package com.baidu.oop.demo04;
    
    //类
    public class Student {
    
        //私有属性
        private String name; //名字
        private int id;//学号
        private char sex;//性别
        private int age;
    
        //提供一些方法操作和这个属性的方法!
        //提供一些public的get,set方法
    
        //get 获得这个数据
        public String getName(){
            return this.name;
        }
        //set 给这个数据设置值
        public void setName(String name){
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public char getSex() {
            return sex;
        }
    
        public void setSex(char sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            if (age>120 || age<0) {//不合法
                this.age = 3;
            }else {
                this.age = age;
            }
        }
    
    
    }
    
    //测试类
    
    import com.baidu.oop.demo04.Student;
    
    /*
        1.提高程序的安全性,保护数据
        2.隐藏代码的实现细节
        3.统一接口
        4.系统可维护增加了
     */
    //一个项目应该只存在一个main方法
    public class Application {
        public static void main(String[] args) {
            Student s1 = new Student();
    
            s1.setName("韩锁");
    
            //方法名,参数列表
            System.out.println(s1.getName());
    
            s1.setAge(-1);//不合法
            System.out.println(s1.getAge());
        }
    
        //alt+insert
    }
    

    继承

    • 继承的本质是对某一批类的抽象。从而实现对现实世界更好建模
    • extents的意思是“扩展”。子类是弗雷的扩展。
    • Java中类只有单继承,没有多继承!(一个儿子只能有一个爸爸,但是一个爸爸可以有多个儿子)
    • 继承是类和类之间的一种关系。除此以外,类和类之间的关系还有依赖,组合,聚合等。
    • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends类表示。
    • 子类和父类之间,从意义上讲应该具有“is a”的关系
    • object类
    • super
    • 方法重写
    //person类
    package com.baidu.oop.demo05;
    
    //在Java中,所有的类,都默认直接或者间接继承Object类
    //Person 人 : 父类
    public class Person /*extends Object*/{
        public Person() {
            System.out.println("Person无参执行了");
        }
    
        //public
        //protected
        //default
        //private
        protected String name = "轻狂书生";
    
        public void print(){
            System.out.println("Person");
        }
    
    }
    //teacher类
    package com.baidu.oop.demo05;
    
    //Teacher is 人  :派生类或子类
    public class Teacher extends Person{
    
    }
    //学生类
    package com.baidu.oop.demo05;
    
    //学生 is 人 : 派生类:子类
    //子类继承了父类,就会拥有父类的全部方法!
    public class Student extends Person{
        public Student(){
            //隐藏代码:调用了父类的无参构造
            super();//调用父类的构造器,必须要在子类的构造器的第一行
            System.out.println("Student无参构造执行了");
        }
    
        private String name = "韩锁";
    
        public void print(){
            System.out.println("Student");
        }
    
        public void test1(){
            print();//Student
            this.print();//Student
            super.print();//Person
        }
    
        public void test(String name){
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(super.name);
    
        }
    
    }
    //测试类
    package com.baidu.oop.demo05;
    
    public class Application {
    
        public static void main(String[] args) {
    
            Student student = new Student();
    
            //student.test("锁子哥");
            //student.test1();
        }
    }
    /*
    super注意点:
        1.super调用父类的构造方法,必须在构造方法的第一行
        2.super必须只能出现在子类的方法或者构造方法中!
        3.super和this不能同事调用构造方法!
    
    VS this:
        1.代表的对象不同
            this:本身调用的这个对象
            super: 代表父类对象的应用
        前提
            this: 没有继承也可以使用
            super:只能在继承条件下才可以使用
        构造方法
            this();本类的构造
            super();父类的构造
     */
    
    
        //静态方法和非静态方法的区别很大
        //静态方法:方法的调用只能和左边,定义的数据类型有关
        
        //非静态:重写
        public static void main(String[] args) {
    
    
            A a = new A();
            a.test();//A
    
            //父类的引用指向子类
            B b = new A();//子类重写了父类的方法
            b.test();//B
        }
    
    /*
    重写:需要有继承关系,子类重写父类的方法!
        1.方法名必须相同
        2参数列表必须相同
        3.修饰符:范围可以扩大但不能缩小: public>protected>default>private
        4.抛出异常:范围,可以被缩小,但不能扩大: ClassNotFoundException--->Exception(大)
    重写,子类的方法和父类必须要一致,方法体不同!
    
    为什么需要重写:
        1.父类的功能,子类不一定需要,或者不一定满足
        Alt + Insert : override;
        
     */
    
    

    多态

    • 动态编译:类型:可扩展性
    • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
    • 一个对象的实际类型是确定的,但可以只想对象的引用的类型有很多(父类,有关系的类)
    • 多态存在的条件
      • 有继承关系
      • 子类重写父类方法
      • 父类引用只想子类对象
    • 注意:多态是方法的多态,属性没有多态性
    • instanceof (类型转换) ~ 引用类型,判断一个对象是什么类型~
    package com.baidu.oop;
    
    import com.baidu.oop.demo06.Person;
    import com.baidu.oop.demo06.Student;
    
    public class Application {
    
        public static void main(String[] args) {
            //一个对象的实际类型是确定的
            //new Student();
            //new  Person();
    
            //可以指向的引用类型就不确定了,父类的引用指向子类的类型
            //Student能调用的方法都是自己的或者继承父类的
            Student s1 = new Student();
            //Person 父类型,可以指向子类,但是不能调用子类独有的方法
            Person s2 = new Student();//父类的引用指向子类的类型
            Object s3 = new Student();
    
            //对象能执行那些方法,主要看对象左边的类型,和右边关系不大
            ((Student)s2).eat();//子类重写了父类的方法,执行了子类的方法
            //s1.eat();
    
        }
    
    
    }
    
    package com.baidu.oop.demo06;
    
    public class Student extends Person{
        @Override
        public void run() {
            System.out.println("son");
        }
        public void eat(){
            System.out.println("eat");
        }
    }
    
    
    package com.baidu.oop.demo06;
    
    public class Person {
        public void run() {
            System.out.println("run");
        }
    }
    
    
    
    /*
    多态注意事项:
    1.多态是方法的多态,属性没有多态
    2.父类和子类,有联系  类型转换异常! ClassCastException!
    3.存在条件:继承关系,方法需要重写,父类引用指向子类对象 father f1 = new Son();
    
        1.static方法,属于类他不属于实例
        2.final常量
        3.privat方法
     */
    
    
    //instanceof和类型转换
    package com.baidu.oop;
    
    import com.baidu.oop.demo06.Person;
    import com.baidu.oop.demo06.Student;
    import com.baidu.oop.demo06.Teacher;
    
    public class Application {
    
        public static void main(String[] args) {
            //Object > String
            //Object > Person > Teacher
            //Object > Person > Student
            Object object = new Student();
    
            //System.out.println(X instanceof Y);//能不能编译通过
    
            System.out.println(object instanceof Student);//True
            System.out.println(object instanceof Person);//T
            System.out.println(object instanceof Object);//T
            System.out.println(object instanceof Teacher);//False
            System.out.println(object instanceof String);//F
            System.out.println("--------------------------------------------");
            Person person = new Student();
    
            System.out.println(person instanceof Student);//True
            System.out.println(person instanceof Person);//T
            System.out.println(person instanceof Object);//T
            System.out.println(person instanceof Teacher);//False
            //System.out.println(person instanceof String);//编译报错
    
            Student student = new Student();
            System.out.println("--------------------------------------------");
            System.out.println(student instanceof Student);//True
            System.out.println(student instanceof Person);//T
            System.out.println(student instanceof Object);//T
            //System.out.println(student instanceof Teacher);//编译出错
            //System.out.println(person instanceof String);//编译报错
        }
    
    
    }
    
    import com.baidu.oop.demo06.Person;
    import com.baidu.oop.demo06.Student;
    
    public class Application {
    
        public static void main(String[] args) {
            //类型之间的转化:父 子
    
            //高                   低
            Person obj = new Student();
            //Student将这个对象转换为Student类型,我们就可以使用Student类型的方法了
            Student student = (Student)obj;
            student.go();
            //((Student) obj).go();
        }
  • 相关阅读:
    UVA 254 Towers of Hanoi
    UVA 701 The Archeologists' Dilemma
    UVA 185 Roman Numerals
    UVA 10994 Simple Addition
    UVA 10570 Meeting with Aliens
    UVA 306 Cipher
    UVA 10160 Servicing Stations
    UVA 317 Hexagon
    UVA 10123 No Tipping
    UVA 696 How Many Knights
  • 原文地址:https://www.cnblogs.com/wl-blog/p/15014495.html
Copyright © 2011-2022 走看看