封装、继承、单例

封装

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;
        }
}

原文地址:https://www.cnblogs.com/lijun199309/p/9449441.html

时间: 2024-11-17 09:07:42

封装、继承、单例的相关文章

iOS 设计模式之单例

设计模式:单例 一.  单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例模式的要点有三个:一是某个类只能有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例. 二.单例模式结构图: 三. 单例的好处: 1.实例控制:单例模式会阻止其他对象实例化其自己的单例对象

单例类的实现

单例类:大概理解为只有一个对象的类,无论怎么创建都只有会分配一个内存 这几天,需要实现某个功能,而且在很多的类里面都要调用这个方法,所以我索兴就封装了一个类,直接调用这个类里面的方法就可以实现了,不需要每次都去写同一个方法(这是大背景),之后在在调用的时候我又发现我需要每次都要用同一个对象(重点来了),所以我才需要封装一个单例的类,而且这样不会浪费内存. 好了,直接上代码了: +(UIView*)initActivityIndictionView { static UIView *view =

OC单例详解

单例(singleton) 实现单例模式有三个条件: 类的构造方法是私有的 类提供一个类方法用于产生对象 类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 类的构造方法是私有的我们只需要重写allocWithZone方法,让初始化操作只执行一次 类提供一个类方法产生对象这个可以直接定义一个类方法 类中有一个私有的自己对象我们可以在.m文件中定义一个属性即可 可以保证在程序运行过程,一个类只有一个实例 应用场景 某个类经常被使用(节约系统资源) 定义工具类 共享数据 注意点 不要继

Volley自定义Request及使用单例封装RequestQueue

一.自定义Request Volley的所有的请求的超类型是Resuest,所有我们常用的请求都是这个类的子类,那么我们自定义View肯定也是基于这个类的. 案例: 1 package com.zhy.velloydemo; 2 3 import java.io.UnsupportedEncodingException; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import com.android.volley.AuthFa

JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静态块(在类加载时执行,且只执行一次[在构造块前执行]eg:数据库连接) System.out.println("我是静态块!"); } public Main(){ System.out.println("我是构造方法!"); } public static void

登记式单例实现单例模式的继承(限定一个抽象类的所有子类都必须是单例)

一直都在想如何在Java写一个抽象类,让该抽象类的所有子类都限定为单例模式,一个类需要设计成单例时直接继承该抽象类,而单例的限定与实例获取交给抽象类来完成.一个传统的单例类形如一下形式: 1 public class Singleton { 2 private static final Singleton singleton = new Singleton(); 3 4 //限制产生多个对象 5 private Singleton(){ 6 } 7 8 //通过该方法获得实例对象 9 publi

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有23种设计模式,解决某一问题最有效的方法 单例设计模式 解决一个类在内存中只存在一个对象 想要保证对象唯一该怎么做> 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 2.还为了让其他程序访问到该类对象,只好在本类中自定义一个对象 3.为了方便其他程序对自定义对象的访问,可以对外提供

C++可继承的单例基类模板

目录 一.介绍 二.代码 三.关键处 四.使用限制 五.参考资料 一.介绍 最近在写一个项目,其中用到好几个单例,类本身的设计不是很复杂,但是如果每个都写一遍单例又觉得有点冗余:所以查资料写了一个单例基类模板,只要一个类继承这个基类并且以自身作为模板参数就可以实现一个单例:关于单例本身的介绍在这里不重点介绍. 特点: RAII,使用 std::shared_ptr来管理资源 线程安全,加了锁 以上特性基于C++11 二.代码 // bridf: a singleton base class of