目录
浅拷贝
深拷贝
内部类
匿名内部类
实例内部类
静态内部类
外部类
浅拷贝
简单理解:定义了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;}//这个方法是用于复制当前类的一个实例//通过调用该方法,可以得到一个与原始对象相同属性的新对象。@Overrideprotected Object clone() throws CloneNotSupportedException {//uper是关键字,它被用于引用当前类的父类或直接父类中的方法、属性等。return super.clone();}//这个代码段定义了一个类toString()//它会将实例中的属性打印成一个字符串//例如,在这里,它会根据Person类中定义的age属性//生成如下输出:Person{age=30}@Overridepublic 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;//证明我能被克隆@Overrideprotected 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();}//在主函数里面调用附加函数克隆@Overrideprotected Object clone() throws CloneNotSupportedException {//return super.clone();//用Jkl来接收克隆出来的对象,再进行修改Jkl tmp=(Jkl) super.clone();//main中是jkl1调用克隆出19.9tmp.m=(Money) this.m.clone();//tmp是常量最后会自动释放//所以用jkl2来指向tmp指向的值return tmp;}@Overridepublic 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(){@Overridepublic void testA() {System.out.println("hehe");}}.testA();*///匿名写法调用方式2A a = new A(){//重写我的testA()方法@Overridepublic 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 内部类名)// 用对象//调用方式1OuterClass.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;}@Overridepublic 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;}@Overridepublic 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();}
}