• 抽象方法和反射和单例模式


    抽象类和方法

    抽象类:它相当于是象棋中的炮架子,而非炮,主要功能是用于重写的。

    抽象方法:包含于抽象类之中,换言之,有抽象类才可能有抽象方法,当然抽象类中也可以无抽象方法,且抽象方法的方法体为空。

    说明:abstract不能修饰属性和构造方法。

     

    抽象类和抽象方法的声明格式:

    抽象类如:public abstract class Person{

          …...

    }

     

    抽象方法如:public abstract void learn();

    /*多态与抽象的联合利用:不同图像计算不同面积的方式*/

    /*多态与抽象的联合利用:不同图像计算不同面积的方式*/

    abstract class Shape{
        abstract float area();
    }
    
    class Circle extends Shape{
        public int r;
        public Circle(int r){
            this.r=r;
        }
        public void setR(int r){
            this.r=r;
        }
        public int getR(){
            return r;
        }
    
        public float area(){
            float s=(float) (3.14*r*r);
            System.out.println("半径为"+r+"的圆形面积为:"+s);
            return s;
        }
    }
    class Square extends Shape{
        public int a,b;
        public Square(int x,int y){
                a=x;
                b=y;
        }
    
        public float area(){
            float s=(float) (a*b);
            System.out.println("长宽分别为"+a+","+b+"的长方形面积为:"+s);
            return s;
    
        }
    }
    
    public class AbstractArray{
        public static void main(String[] args) {
            float mianJi=0;
            //左边是父类,右边赋值的是子类
            Shape[] s={new Circle(3),new Circle(4),new Circle(5),new Square(1,2),new Square(3,4)};
            for (int i=0;i<s.length;i++) {
                mianJi +=s[i].area();
            }
            System.out.println("图形总面积为:"+mianJi);
        }
    }

    /*思路总结:

    首先写一个shape类作为空架子用于后面重写;

    然后,分别写一个圆类和一个长方形类来继承shape类,

    思路顺序:成员属性、构造器、设置并用this指代、获得并并返回,计算面积方法并返回;

    */

    /*运行结果:

    半径为3的圆形面积为:28.26

    半径为4的圆形面积为:50.24

    长宽分别为1,2的长方形面积为;2.0

    长宽分别为3, 4的长方形面积为:12.0

    图像总面积为:171.0;

    */

     

    接口和抽象的异同?

    相同点:

    1.都含抽象方法,声明多个公用方法的返回值和输入参数列表

    2.都不能被实例化

    3.都是引用数据类型,可以声明抽象类即接口变量,并将子类对象赋值给抽象类变量,或将

    实现接口类的变量赋值给接口变量。

    不同点:

    1.接口可以多继承,抽象类只能单继承

    2.抽象类即成员都具有与普通类一样的权限,而接口只有public和默认权限,接口成员变量的访问权限都是public

    3.抽象类可以声明变量,而接口中只能声明常量。

    4.抽象类可以声明抽象方法、普通方法、构造函数,而接口中只能声明抽象方法。

     

     

    反射

    一.定义:

    java反射机制是运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的发射

    机制。(获取类的方法和属性或调用对象的方法和属性称为java反射机制)

     

    二.特点:

    指的是我们可以运行加载、探知、使用编译期间完全

    未知的classes。java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

     

    三.功能:

    1.运行时判断对象所属的类;

    2.在运行时构造任意一个类的对象;

    3.在运行时判断任意一个类所具有的成员变量和方法;

    4.在运行时调用一个对象的方法;

    5.生成动态代理;

     

    四.反射机制的作用:

    1.反编译:.class—>.java

    2.通过反射机制访问java对象的属性、方法、构造方法等;

     

    五.Sun公司提供反射机制中的类:

    java.lang.class;

    java.lang.reflect.Constructor;

    java.lang.reflect.Field;

    java.lang.reflect.Method;

    java.lang.reflect.Modifier;

    学会查API

     

    六.具体功能的实现:

    1.反射机制获取类有三种方法,我们来获取Employee类型

    第一种方式:

    Classc1=Class.forName(“Employee”);

     

    第二种方式:

    //java中每个类型都有class属性

    Classc2=Employee.class;

     

    第三种方式:

    //java语言中任何一个java对象都有getClass方法

    Classc3=e.getClass();

    //C3是运行时类(e的运行时类是Employee)

     

    2.创建对象:获取以后我们来创建它的对象,利用newInstance.

    Class c=Class.forName(“Employee”);

     

    //创建此Class对象所表示的类的一个新实例

    Objecto=c.newInstance();

    //调用了Employee的无参数构造方法。

     

    //获取整个类

     

    Class c=Class.forName("java.lang.Integer");

    //获取所有的属性

    Field[] fs=c.getDeclaredFields();

    //定义可以变长的字符串,用来存储属性

    StringBuffer sb=new StringBuffer();

    //通过追加的方法,将每个属性拼接到此字符串中

    sb.append(Modifier.toString(c.getModifiers())+"class"+c.getSimplename()+"{ ");

    for (Field  field:fs) {

    sb.append(" ");

    //空格

    sb.append(Modifier.toString(field.getModifiers())+" ");

    //获取属性的修饰符,如public,static等

    sb.append(field.getSimplename()+" ");

    //属性的类型的名字

    sb.append(field.getName()+"; ");

    //属性的名字+回车

    }

    sb.append("}");

    System.out.println(sb);

     

    三种对String的累加操作

    1.String tmp=“a”+”b”+”c”;

    2.String tmp=null;

                tmp=“a”;

                tmp=“b”;

                tmp=“c”;

    3.String tmp=null;

                StringBuffer buf =new StringBuffer();

                buf.append(“a”);

                buf.append(“b”);

                buf.append(“c”);

                tmp=buf.toString();

     

    程序执行过程:

    对于编译生成的.class文件,ClassLoader将其Load到内存中

    CodeSegment,然后运行环境找到main方法开始执行,运行

    过程中会有更多的Class被load到内存中,到有需要时,再加载,不是一次性加载运行期间动态加载(用到的时候再加载)。

     

    public class TestDynamicLoading{
        public static void main(String args[]){
        new A();
        System.out.println("**----------**");
        new B();
    
        new C();
        new C();
        new D();
        new D();
        }
    }
    class A(){
        
    }
    class B(){
        
    }
    class C(){//静态语句块,对于C它只加载一行(对于两个new c())
        static{
             System.out.println("CCCCCCCCC");
        }
    }
    class D{//动态语句块,对于D它加载两行(对于两个new D)
          D(int i){}
        {
          System.out.println("DDDDDDDDD");
        }
    }//此代码无条件加载在每个构造方法的前面

    /*

    总结:static语句块每次new新的对象都会执行

    dynamic语句块每次new新的对象都会执行。

    1.等用于构造方法中语句

    2.用的较少 */

    public class TestJDKClassLoader{
        
        public static void main(String[] args){
               System.out.println(String.class.getClassLoader());
        }
    }
    
    //把反射学完了,可以看看马士兵在反射中最后讲到的工厂模式
    /*单例模式*/
    public class SingletonTest{
        public static void main(String[] args){
        Singleton instance=Singleton.getInstance();
        instance.test();
        }
    }
    /*单例类*/
    class Singleton{
        private static Singleton sing=new Singleton();
        private Singleton(){
    
        }
        public static Singleton getInstance(){
        return sing;
        }
        public void test(){
        System.out.println("test");
        }
    }

    /*说明:

    通过类方法返回本类的对象,其中单例类的构造器设为私有的,只能本类内部才能调用它,还初始化一个本类对象sing,只能通过类外部

    来访问getInstance对象,即使用程序时只有一个实例,也就是我们所说的单例模式。

    */

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Google官方关于Android架构中MVP模式的示例续-DataBinding
    值不值
    [译]Godot系列教程五
    [译]Google官方关于Android架构中MVP模式的示例
    遭遇Web print
    如何寻找有价值的点
    充电时间 Go中的数组、切片、map简单示例
    一段良好的程序永远不应该发生panic异常
    居然是Firefox没有抛弃我们
    macOS 升级到了10.12.1
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8313378.html
Copyright © 2020-2023  润新知