封装继承单例

Posted lijun199309

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装继承单例相关的知识,希望对你有一定的参考价值。

封装

package com.qianfeng.test;
//封装性:(根据对属性的封装来说明):把对成员变量的访问进行私有化,通过一个公共的方法间接的实现访问.
//好处:提高了代码的安全性,增加了代码的可读性和复用性.
public class Demo2 {
    public static void main(String[] args) {
        /*
         * 开枪射击
         */
        Gun gun = new Gun();
        //我们把程序中出现的不符合逻辑的数据称为脏数据
        /*
         * 原因:直接将脏数据赋值给了成员变量
         * 解决:1.不要将数据直接赋值给成员变量--将成员变量私有化
         * 2.通过方法间接的访问他,在方法内先过滤,再赋值
         */
        //gun.bulletNumber = -5;
        gun.addBullet(-5);
        gun.shoot();
        /*
         * 因为对所有的属性都要进行赋值取值,所以系统指定了一整套的规范--get,set
         * set:--赋值的过程
         * 构成: 修饰词  返回值  方法名(参数列表){方法体
         *         return 返回值
         * }
         * 修饰词:一定是public
         * 返回值:是void
         * 方法名:set+成员变量的名字,但是需要首字母大写.
         * 参数列表:只有一个参数,并且参数的类型和名字与成员变量一致
         * 方法体:不需要return    要写的代码是:this.成员变量=参数的名字
         * get:--取值的过程
         * 构成: 修饰词  返回值  方法名(参数列表){方法体
         *         return 返回值
         * }
         * 修饰词:一定是public
         * 返回值:类型与成员变量一致
         * 方法名:get+成员变量的名字,但是需要首字母大写.
         * 参数列表:不需要参数
         * 方法体的代码:return  成员变量
         * 
         * 快捷方式:shift+alt+s
         */
    }
}

class Gun{
    //被private修饰的只能在当前类内可见
    private int bulletNumber;
    private int age;
    private String name;
    private double weight;
    private double height;
    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    //子弹的添加
    public void addBullet(int bulletNumber){
        //过滤的过程
        if (bulletNumber >=0) {
            this.bulletNumber = bulletNumber;
        }else {
            this.bulletNumber = 0;
        }
    }
    
    public void setBulletNumber(int bulletNumber){
        this.bulletNumber = bulletNumber;
    }
    public int getBulletNumber() {
        return bulletNumber;
    }
    
    //射击方法
    public void shoot(){
        if (bulletNumber > 0) {
            --bulletNumber;
        }
        System.out.println("剩下的子弹数量:"+ bulletNumber);
    }
}
继承
package com.qianfeng.test;
/*
 * 继承:有两个类A类与B类,当让他们之间产生父子的关系,就叫继承
 * 
 * B继承自A     B extends A
 * 
 * 重写:当子类有与父类同名(方法名,参数,返回值等都要相同)的方法.
 * 注意点:相当于子类的同名方法将父类的覆盖了,不会再去调用父类方法.
 * 
 * 作用:在不改变父类名字的前提下,在父类原有功能的基础之上,实现一些属于自己的功能.实现对原有功能的扩充.
 * 
 * this:是一种引用数据类型,保存的是当前对象的地址,代表当前的对象
 * super:是一个关键字,但是不是引用数据类型.可以通过super调用父类的成员
 * 
 * 注意事项:
 * 1.私有方法不能被重写
 * 2.子类的同名方法的权限要大于等于父类的同名方法
 * 3.静态的方法只能覆盖静态的方法
 */
public class Demo3 {
    public static void main(String[] args) {
        Iphone iphone = new Iphone();
        iphone.color = "绿色";//调用父类的属性
        iphone.fangShui();//调用自己的方法
        //子类调用父类的方法原理:首先由引用找到当前的子类对象,在当前的对象里面找这个方法,找到了,直接调用.找不到,再去父类中找
        //依次执行,直到找到Object,如果还是没有,说明确定没有这个方法,报错.
        iphone.callPhone();//调用父类的方法
    }
}
//注意:如果什么都不写,默认父类是Object
class Phone{
    String color;
    int model;
    
    public void callPhone(){
        System.out.println("打电话");
    }
    
    public static void play(){
        
    }
}

//描述的是 Iphone 继承自 Phone
class Iphone extends Phone{
//    String color;
//    int model;
    String gui;
    
    public void callPhone(){
        //this.callPhone();//调用的本对象的callPhone方法--死循环
        super.callPhone();//直接调用的父类的方法
        
        System.out.println("执行自己的功能");
    }
    
    public void fangShui(){
        
        System.out.println("防水");
    }
    
    //静态的方法只能覆盖静态的
    public static void play() {

    }
}

class HuaWei extends Phone{
//    String color;
//    int model;
    
//    public void callPhone(){
//        System.out.println("打电话");
//    }
//    
    public void Niu(){
        System.out.println("牛");
    }
}
继承的构造方法
package com.qianfeng.test;
/*
 * 继承中构造方法的使用
 * 
 * 1.当一个子类中只有一个带参数的构造方法,只能使用带参数的,不能使用无参的.如果想使用,必须手动建立无参的构造方法
 * 2.当父类中只有带参数的构造方法,子类的构造方法中就必须在第一行手动调用父类带参数的构造方法(super(参数))
 * 3.当我们创建构造方法的时候,如果自己不写super(),系统会自动调用
 * 原因:父类中也有属性要进行初始化,而对象的属性必须由自己的构造方法进行初始化,所以必须调用super(),
 * 所以每个构造方法中都默认有一个super()
 * 
 * 为什么要将super放在方法的第一行?
 * 答:在子类的构造方法中有可能用到父类的属性,而属性在使用之前必须先进行初始化,否则无法使用.
 * 
 * 总之:在继承体系中,作为父类最好的办法就是将无参构造方法和有参构造方法都写了.
 */
public class Demo4 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.getName();
    }
}

class Animal{
    private String name;

    public String getName() {
        return name;
    }

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

    public Animal() {

    }

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

class Dog extends Animal{
    //无参构造方法
    public Dog() {
        //super();//默认调用父类的无参构造方法
        //注意:这行代码必须放在第一行
        super("拉布拉多");//手动调用父类有参构造方法
        
        
    }
    //有参构造方法
    public Dog(String name) {
        super("拉布拉多");
        this.setName(name);
    }
}
单例
package com.qianfeng.test;
/*
 * 设计模式:前人总结出来的经验后人直接拿来使用.
 * 设计模式种类:23种       常用的:单例,模板,工厂,装饰,适配器,代理
 * 单例设计模式:一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用
 * 分析:
 * 要设计单例类:
 * 1.用户只能有一个对象
 * 2.建立全局的访问点?  得到的对象就是全局的访问点.    怎么做到全局? static
 * 3.提供出去?
 * 4.供大家使用?--单例的功能.
 * 
* 单例类的作用:1.可以实现两个对象之间的传值
  * 2.可以在全局范围内调用很多的功能.
 * 好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性
 * 
 * 耦合性,内聚性在微观上说:描述的是类与类之间的关系
 * 好处:我们应该尽量提高内聚性,减少耦合性,可以提高程序的健壮性,增加代码的可移植性,方便实现模块儿化编程
 * 
 * 如何做到低耦合高内聚?
 * 在处理类与类关系的时候,让类之间的关系越紧密耦合性越高,内聚性越低.反之,关系越松散耦合性越低,内聚性越高.
 */

//创建单例类
//饿汉式:在定义变量的同时完成初始化
class SingleInstance{
    //2.在类的内部创建一个私有的对象
    //将singleInstance变成静态的--相当于提供全局的访问点
    private static SingleInstance singleInstance = new SingleInstance();
    //1.将构造方法私有化
    private SingleInstance() {
    }
    
    //3.通过一个公共的方法将变量提供出去,供大家访问
    //将公共方法变成静态的
    public static SingleInstance getInstance(){
        return singleInstance;
    }
    
    //功能区--非静态的成员
    int num;
}

//懒汉式:什么时候使用什么时候赋值
class SingleInstance1{
    //在类的内部创建一个私有的对象
    //将singleInstance变成静态的--相当于提供全局的访问点
    private static SingleInstance1 singleInstance = null;
    //将构造方法私有化
    private SingleInstance1() {
    }
    
    //通过一个公共的方法将变量提供出去,供大家访问
    //将公共方法变成静态的
    public static SingleInstance1 getInstance(){
        if (singleInstance == null) {
            singleInstance = new SingleInstance1();
        }
        return singleInstance;
    }
    
    //功能区--非静态的成员
}


public class Demo5 {
    public static void main(String[] args) {
        //SingleInstance已经被私有化,不能再直接调用
//        SingleInstance singleInstance1 = new SingleInstance();
//        SingleInstance singleInstance2 = new SingleInstance();
//        System.out.println(singleInstance1 == singleInstance2);//false
        
        //让用户获取单例对象
//        SingleInstance singleInstance1 = SingleInstance.getInstance();
//        SingleInstance singleInstance2 = SingleInstance.getInstance();
//        System.out.println(singleInstance1 == singleInstance2);//true
        
        //实现功能:将A类的对象中的num1的值传给B类的对象的属性num2
        
        //第一种方式:直接赋值,但是一般类的成员变量都是私有的,所以不推荐
        A a = new A();
        a.num1 = 4;
        
        B b = new B();
        b.num2 = a.num1;
        
        //第二种:通过传参
        b.test(a);
        
        //第三种方式:通过单例
        a.ceshiDanli1();
        b.ceshiDanli2();
    }
}
class A{
    int num1;
    
    //通过单例传值
    public void ceshiDanli1(){
        SingleInstance singleInstance = SingleInstance.getInstance();
        singleInstance.num = num1;
    }
}

class B{
    int num2;
    
    //通过传参
    public void test(A a){
        num2 = a.num1;
    }
    
    //通过单例传值
    public void ceshiDanli2(){
        SingleInstance singleInstance = SingleInstance.getInstance();
        num2 = singleInstance.num;
    }
}

求两点距离代码

package day08ketang;
import java.util.Scanner;
public class demo05 {
        public static void main(String[] args) {
                Scanner scanner = new Scanner(System.in);
            System.out.print("请输入点1的横坐标:");
                double x1 = scanner.nextDouble();
            System.out.print("请输入点1的纵坐标:");
                double y1 = scanner.nextDouble();
                Point2 p1=new Point2(x1, y1);
                System.out.print("点1的坐标为:");
                /*
                 * 考虑人性化 按坐标形式打印
                 */
                p1.show();
            System.out.print("请输入点2的横坐标:");
                double x2 = scanner.nextDouble();
            System.out.print("请输入点2的纵坐标:");
                double y2 = scanner.nextDouble();
                Point2 p2=new Point2(x2, y2);
                System.out.print("点2的坐标为:");
                /*
                 * 考虑人性化 按坐标形式打印
                 */
                p2.show();
                 /*
                   * 方法一  静态调用
                   */
//                double distance = Point2.distance(p1, p2);
                /*
                 *  方法二 非静态调用
                 */
            double distance = p1.distance(p2);
            System.out.println("两点之间的距离为: " + distance);
        }
}

class Point2 {
    public  double x;
    public  double y;
    /*
     * 有参构造函数
     */
        public Point2(double x, double y){
            this.x = x;
            this.y = y;
        }
        /*
         * 考虑人性化 按坐标形式打印
         */
          public void show(){
                System.out.println("("+x+","+y+")");
            }
          /*
           * 方法一  静态方法
           */
        public static double distance(Point2 p1, Point2 p2){
//            return Math.sqrt(Math.pow(p1.getX() - p2.getX(), 2) + Math.pow(p1.getY()-p2.getY(), 2));
            return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y-p2.y, 2));
        }
        /*
         *  方法二 非静态方法
         */
        public  double distance(Point2 p){
            return Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
        }
        
        
        public  double getX() {
            return x;
        }
        public  double getY() {
            return y;
        }
}

 

以上是关于封装继承单例的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象:继承多态类属性和类方法单例

java中封装,继承,多态,接口学习总结

swift4.0 对 afn 进行二次封装

单例模式再议

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装