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();
    }
}
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习