美文网首页
Java_继承与多态

Java_继承与多态

作者: 书虫大王X | 来源:发表于2019-08-11 00:03 被阅读0次

    1.知识点:
    1.代码块
    2.内部类
    3.继承
    4.多态
    5.单例设计模式
    2.知识点的总结及简单使用:
    1.代码块(对象被创建之前会被加载):

    • 格式:
    修饰符{
      预先加载的内容
      }
    //如果有修饰符,则一定是static
    //例子:
    class Test3{
        int a;
        //代码块(在创建对象之前加载)
        {
            a = 20;
            System.out.println(a);
        }
        public Test3(){
            System.out.println(a);
        }
    }
    

    打印结果:

    20
    20
    
    • 静态代码块不能调用成员变量和实例方法,因为在对象被创建之前,代码块已经被预先加载。

    • 如果有多个代码块,会出现同一变量可能会出现值覆盖的情况(且代码块没有名字所以一个类尽量只写一个代码块)
      2.内部类:

    • 定义一个类的位置:

    • 1.单独创建一个文件管理类

    • 2.直接在文件里面 类A的上面和下面创建

    • 3.直接在某个类A内部创建一个类(内部类:一个类依附于另一个类)

    • 内部类分为静态内部类和普通内部类。

    class relativeLayout{
        String view;
        public void show(float left,float top,float bottom,float right){
            LayoutParems layoutParems = new LayoutParems(left,top,right,bottom);
            System.out.println("试图:" + view + "显示出来了");
            System.out.println("left:" + left +"right:" + right+"top:" + top+"bottom:" + bottom);
    
            System.out.println(layoutParems);
        }
    
        //定义一个内部类
        public class LayoutParems{
            //定义属性
            float leftMergin;
            float topMergin;
            float rightMergin;
            float bottomMergin;
    
            public LayoutParems(float leftMergin, float topMergin, float rightMergin,
                                float bottomMergin){
                this.leftMergin = leftMergin;
                this.bottomMergin = bottomMergin;
                this.topMergin = topMergin;
                this.rightMergin = rightMergin;
            }
            //实现LayoutParems的toString方法
            @Override
            public String toString() {
                return "LayoutParems{" +
                        "leftMergin=" + leftMergin +
                        ", topMergin=" + topMergin +
                        ", rightMergin=" + rightMergin +
                        ", bottomMergin=" + bottomMergin +
                        '}';
            }
        }
    }
    
    //调用测试
    class testLayout{
        public static void main(String[] args){
            relativeLayout rl = new relativeLayout();
            
            rl.view = "分享按键";
            rl.show(20,20,20,20);
        }
    }
    

    //打印结果:

    left:20.0right:20.0top:20.0bottom:20.0
    LayoutParems{leftMergin=20.0, topMergin=20.0, rightMergin=20.0, bottomMergin=20.0}
    
    

    *非静态的内部类可以访问外部类的属性和方法,例:

    public class TestInner{
        public static void main(String [] args){
            TestInner1 testInner1 = new TestInner1();
            testInner1.test();
        }
    }
    class TestInner1 {
        int a;
        int b;
        Inner inner;
        //创建内部类
        class Inner{
    //重写构造方法
            public Inner(){
                a = 20;
                b = 30;
       //调用外部方法
                show();
    
            }
        }
    
        public  void test(){
            inner = new Inner();
        }
    
        public void  show(){
            System.out.println("a = " + a +" b = " + b);
        }
    }
    

    打印结果:

    a = 20 b = 30
    

    3.封装的三种访问权限:

    • 默认为protected:所修饰的属性、方法是私有受保护的,子类可以继承,外部无法使用(外部:以类所在的包为界限,包以外为外部)
    • privite:所修饰的属性、方法是私有的,子类无法继承,外部无法使用
    • public:所修饰的属性、方法是公共的,子类可以继承,外部可以使用
    4. 继承(extends):
    • 作用:获得父类的东西,并且可以在继承过程中增加自己的东西
    • Java语言中只能单继承
    • 在子类中调用父类的方法或属性,用super调用。
    • 如果一个方法,需要完成一个功能,但又不能单独完成,可以有以下两种方法:
      1.先调用父类完成一定的功能后再调用子类进行操作
      2.先调用子类,再调用父类进行操作
    • 父类与子类中有同名的内部类,正常调用父类的那个类会被覆盖(如果一定要用父类的内部类,可以使用全类名来调用)
    • 所有的类都是直接或间接地继承于object
    • 如果父类有自定义构造方法,子类的构造方法必须显式调用(写出来)父类的构造方法,例:
    //Test1:父类
    class Test1{
        String name;
        int age;
       //自定义构造方法
        public Test1(String name,int age){
            this.name = name;
            this.age = age;
        }
    }
    //子类:Test2 
    class Test2 extends Test1{
    //显式调用父类的构造方法
        public Test2(String name,int age){
            super(name,age);
        }
    }
    

    5.toString方法:
    输出打印一个对象时,要实现toString方法,否则答打印的是对象的地址,例:

    public class Test {
        public static void main(String[] args){
    
            YK yk = new yk("yk",20);
            System.out.println(yk);
    
        }
    }
    class YK{
        String name;
        int age;
        public YK(String name,int age){
            this.age = age;
            this.name = name;
        }
       //toString方法
        @Override
        public String toString() {
            return "yk{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    

    打印结果:

    //没有toString方法的结果:
    day6.yk@75b84c92
    //有toString方法的结果:
    yk{name='yk', age=20}
    

    6.多态:

    • 1.同一个方法,在不同的子类中有不同的实现,例:
    class Test1{
        public  void info(){
            System.out.println("Test1");
        }
    }
    class Test2 extends Test1{
        @Override
        public  void info(){
            System.out.println("Test2 ");
        }
    }
    
    • 2.如果有继承关系,子类的对象可以用父类变量接收(但反过来不行)
    class Test3{
    }
    class Test4 extends Test3{
    }
    class Test5{
     //用父类Test3来接收子类Test4 的对象
        Test3 test = new Test4();
    }
    
    7.单例设计模式:
    • 1.不予许用户自己创建这个类的一个对象
      • 2.操作步骤:a.将构造方法私有化(用private修饰构造方法) b.在自己的类里面提供静态创建对象的方法
      • 3.对单例对象的命名:default、sharedInstance、manager
        例子:
    public class People {
        public static void main(String[] args){
    
            //调用单例
            Poker.shared.test();
    
            Player.getInstance();
            Player p = Player.getInstance();
        }
    }
    //饿汉式单例
    class Poker{
        //定义一个静态的成员变量,记录这个单例对象
        public static final  Poker shared = new Poker();
        //将构造方法私有化
        private Poker(){}
        public void test();
        }
    }
    //懒汉式单例
    class Player{
        //创建静态变量:
        private static Player shared = null;
        //私有化构造方法
        private Player(){}
        // 提供给外部一个访问静态变量的方法
        public static Player getInstance() {
            //加锁(否则在多线程中可能出错)
            Object object = new Object();
            synchronized (object){
                if (shared == null){
                    //如果没有就创建一个对象
                    shared = new Player();
                }
            }
            return shared;
        }
    }
    

    7.ArrayList数组:

    class Test2{
        public static void main(String[] args){
            ArrayList<People1> people1s = new ArrayList();
            //添加数据
            People1 xw = new People1();
            people1s.add(xw);
            //访问数据
            People1 xw2 = people1s.get(0);
            xw2.name = "小王";
            System.out.println(xw.name);
            System.out.println(xw2.name);
        }
    }
    class People1{
        public String name;
    
        @Override
        public String toString() {
            return "People1{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    

    打印结果:

    小王
    小王
     //ArrayList数组:里面保存的都是对象的引用(指针)
     //改变数组里面对象的属性变量,原始对象的值也跟着改变(指向的都是同一个内存空间)
    

    相关文章

      网友评论

          本文标题:Java_继承与多态

          本文链接:https://www.haomeiwen.com/subject/kcqdjctx.html