Java浅,深拷贝;内,外部类的学习了解

目录

浅拷贝

深拷贝

内部类

匿名内部类

实例内部类

静态内部类

外部类


浅拷贝

简单理解:定义了A,A里面有age和num,拷贝成为B,B里面有age和num

package demo1浅克隆和深克隆;

    //interfaces 是定义了一个接口
    //implements是使用这个接口的关键字
    //implements Cloneable:使用这个接口并且克隆一份
    class Person implements Cloneable{
        //声明
        public int age;
        //调用使用
        public Person(int age){
            this.age=age;
        }

        //这个方法是用于复制当前类的一个实例
        //通过调用该方法,可以得到一个与原始对象相同属性的新对象。
        @Override
        protected Object clone() throws CloneNotSupportedException {
            //uper是关键字,它被用于引用当前类的父类或直接父类中的方法、属性等。
            return super.clone();
        }

        //这个代码段定义了一个类toString()
        //它会将实例中的属性打印成一个字符串
        //例如,在这里,它会根据Person类中定义的age属性
        //生成如下输出:Person{age=30}
        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    '}';
        }
    }

    public class Test克隆案例浅拷贝 {

        public static void main(String[] args) throws CloneNotSupportedException {

            Person person1=new Person(10);
            Person person2= (Person) person1.clone();
            System.out.println(person1);
            System.out.println(person2);

        }

    }

深拷贝

简单理解:定义了A,A里面有age和num,修改A中age变成k,拷贝成为B,B里面有k和num

package demo1浅克隆和深克隆;

//加的类,副加函数克隆
class Money implements Cloneable{
    public double money=19.9;

    //证明我能被克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

//主函数克隆
class Jkl implements Cloneable{
    public int age;

    //加的成员
    public Money m;

    //构造方法
    public Jkl(int age){
        this.age=age;

        //在构造方法里面进行实例化一次
        this.m=new Money();

    }

    //在主函数里面调用附加函数克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //return super.clone();

        //用Jkl来接收克隆出来的对象,再进行修改
        Jkl tmp=(Jkl) super.clone();

        //main中是jkl1调用克隆出19.9
        tmp.m=(Money) this.m.clone();
        //tmp是常量最后会自动释放
        //所以用jkl2来指向tmp指向的值
        return tmp;
    }

    @Override
    public String toString() {
        return "Jkl{" +
                "age=" + age +
                '}';
    }
}


public class Test深拷贝 {

        public static void main(String[] args) throws CloneNotSupportedException {

            Jkl jkl1=new Jkl(10);
            Jkl jkl2= (Jkl) jkl1.clone();

            System.out.println(jkl1);
            System.out.println(jkl2);

            System.out.println("==================");

            //修改成下面这样的形式
            System.out.println(jkl1.m.money);
            System.out.println(jkl2.m.money);

            System.out.println("==================");
            jkl2.m.money=99.99;
            System.out.println(jkl1.m.money);
            System.out.println(jkl2.m.money);

        }

}

内部类

将一个类定义在另一个类的内部

匿名内部类

package demo内部类;

//一个类一个字节码文件

//定义一个接口,接口里面定义一个方法 给匿名内部类
interface A{
    void testA();
}

public class Test匿名内部类 {

    public static void main(String[] args) {
        //匿名内部类
        //下面代码可以认为:有一个类,实现了A接口并且重写了A接口中的方法
        //匿名写法调用方式1
        /*new A(){

            @Override
            public void testA() {
                System.out.println("hehe");
            }
        }.testA();*/

        //匿名写法调用方式2
        A a = new A(){
            //重写我的testA()方法
            @Override
            public void testA() {
                System.out.println("hehe");
            }
        };
        //能够访问的是,没有被修改过的数据(变量的捕获)
        //即默认访问被final修饰的量(常量)
        a.testA();
    }

}

实例内部类

package demo内部类;

/*
* 1.如何获取实例内部类
* 2.在实例内部类中,是否可以定义静态的成员变量?
*   public static final int data6=6;中间加个final
*   因为final是修饰常量,实力内部类要依赖普通类
* 3.当实例内部类和普通类都定义了的public int data1;
*   在实例内部类中打印的data1是先打印data1所在的类
* (this.data也是)一样的,所以输出11111.
*   如果我硬要用实例内部类中的data1打印普通类(在实例内部类外面)的data1值
*   那么就:普通类名+this.data1(OuterClass.this.data1)
*
*   实例内部类的缺点:每次使用都要创建一个普通类,通过它来引用实例内部类
*                   静态内部类则不用这样
*
* */




//OuterClass这个普通类
class OuterClass{

    //普通的成员变量
    public int data1=1;
    private int data2=2;
    public static int data3=3;

    //普通的成员内部类
    //实例内部类
    class InnerClass{
        public int data1=11111;
        public int data4=4;
        private int data5=5;
        public static final int data6 = 6;

        //定义普通的成员方法
        public void test(){
            System.out.println(data1);
            System.out.println(OuterClass.this.data1);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("内部类的test方法");
        }
    }

    //普通类自己的方法
    public void test(){
        System.out.println("外部类的test方法");
    }

}

public class Test实例内部类 {

    public static void main(String[] args) {
        //如何使用内部类

        //先声明正常类的调用

        //外部类名   外部对象名
        OuterClass outerClass=new OuterClass();
        System.out.println(outerClass.data1);
        System.out.println("==================");

        //再在正常内部类上调用实例内部类
        //1.总结:获取一个实例内部类对象,依赖于外部类对象(外部类名.内部类名 内部对象名 =外部对象名.new 内部类名)
        //                                                                  用对象
        //调用方式1
        OuterClass.InnerClass innerClass=outerClass.new InnerClass();
        innerClass.test();

        //调用方式2
        //因为outerClass=new OuterClass(); 所以替换掉outerClass
        //OuterClass.InnerClass innerClass2=new OuterClass().new InnerClass();
        //innerClass2.test();

    }


}

静态内部类

package demo内部类;

/*
*1.如何获取实例内部类
* (外部类名.内部类名 内部对象名=new 外部类名.内部类名)
* 2.在实例内部类中,是否可以定义非静态(外部)的成员变量?
*   直接在静态里面声明就可以去使用了
*       OuterClass outerClass=new OuterClass();
        System.out.println(outerClass.data1);
*/



//在同一个包里面重名了,所以加上2来区分
class OuterClass2 {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    //静态内部类---不依赖外部对象
    static class InnerClass {
        //当此语句被屏蔽了,data1也不会打印OuterClass2中data1=1的值
        //public int data1=111;
        public int data4=4;
        private int data5=5;
        public static  int data6 = 6;

        public void test(){
            OuterClass outerClass=new OuterClass();
            System.out.println(outerClass.data1);

            System.out.println("==========");
            //System.out.println(data1);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("内部类的test方法");
        }

    }

}


public class Test静态内部类 {

    public static void main(String[] args) {
        //静态的东西是需要 (外部类名.内部类名 内部对象名=new 外部类名.内部类名)去访问的
        //                                            用类名
        OuterClass2.InnerClass innerClass=new OuterClass2.InnerClass();
        innerClass.test();

    }

}

外部类

将一个类定义在一个方法的内部

//抽象类
public abstract class Shape {
    private String color;

    public Shape(String color) {
        this.color = color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public abstract void draw();
}

public class Circle extends Shape {
    private int radius;

    public Circle(String color, int radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a circle of radius " + radius + " with color " + getColor());
    }
}

public class Rectangle extends Shape {
    private int width;
    private int height;

    public Rectangle(String color, int width, int height) {
        super(color);
        this.width = width;
        this.height = height;
    }

    @Override
    public void draw() {
        System.out.println("Drawing a rectangle of width " + width + " and height " + height + " with color " + getColor());
    }
}

//接口
public interface Flyable {
    void fly();
}

public class Bird implements Flyable {
    public void fly() {
        System.out.println("Bird is flying...");
    }
}

public class Airplane implements Flyable {
    public void fly() {
        System.out.println("Airplane is flying...");
    }
}


//外部类
public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle("Red", 10);
        Rectangle rectangle = new Rectangle("Blue", 20, 30);

        circle.draw();
        rectangle.draw();

        Bird bird = new Bird();
        Airplane airplane = new Airplane();

        bird.fly();
        airplane.fly();
    }
}
相关推荐
linly12192 小时前
python学习笔记目录
笔记·学习
LvManBa3 小时前
Vue学习记录之四(computed的用法)
前端·vue.js·学习
Li小李同学Li4 小时前
git学习【持续更新中。。。】
git·学习·elasticsearch
·云扬·4 小时前
Shiro框架
笔记·学习·java-ee
优思学院5 小时前
优思学院|如何从零开始自己学习六西格玛?
大数据·运维·服务器·学习·六西格玛黑带·cssbb
LN花开富贵6 小时前
stm32g431rbt6芯片中VREF+是什么?在电路中怎么设计?
笔记·stm32·单片机·嵌入式硬件·学习
怀九日6 小时前
C++(学习)2024.9.18
开发语言·c++·学习·面向对象·引用·
一道秘制的小菜6 小时前
C++第七节课 运算符重载
服务器·开发语言·c++·学习·算法
极术社区6 小时前
ResNeXt学习
开发语言·学习·计算机视觉·php
徳一8 小时前
【pytorch学习笔记,利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn】
pytorch·深度学习·学习