android(java)知识累积

1、android 控件的 visibility 属性

android 控件的 visibility 属性有 3 个值:visible,invisible,gone。

visible:设置控件可见;

invisible:设置控件不可见;界面保留了 view 控件的占位空间;

gone:设置控件隐藏;界面不保留 view 控件的占位空间。

 

2、java/python 格式化输出

%nd 输出的整型宽度至少为 n 位,右对齐,不足 n 位用空格填充;%5d即宽度至少为5位,宽度大于5则按照实际宽度输出;

%0nd 输出的整型宽度至少为 n 位,右对齐,不足 n 位用0 填充;%05d 即宽度至少为 5 位,宽度大于 5 按照实际宽度输出;

3、成员变量,成员方法定义

4、java 访问控制修饰符

friendly访问特性被称为 包访问特性。

 

5、java-Cloneable 接口。(为什么要重写 clone(),深拷贝和浅拷贝)

1)某个类若调用 clone(),首先需要实现 Cloneable 接口。这相当于类对象支持 clone()的标识;

2)如果在没有实现 Cloneable 接口的类实例上调用 Object 的 clone()方法,会导致抛出 CloneNotSupportedException;

3)Object 的 clone()方法是一个受保护的方法,实现此接口的类应该使用公共方法重写 Object的 clone()方法。

【为什么要用public 重写 clone()方法,目标类继承树的顶端都是 Object 类,也是可以访问 clone()方法的呀~】

1、因为Object 的 clone()方法是一个受保护(protected)的方法,如果不重写,在不同包下,别的类即使用目标类的对象也不能访问目标类继承的 clone()方法,只能在目标类内使用,局限性很大,所以一般都会进行重写,并扩大成 public 范围;

2、Object.clone()只是提供了浅层拷贝,对于基本类型的字段,可以成功克隆,但对于引用类型,只是复制了对象的引用关系,但没有创建新的对象。所以含有引用类型的字段要“定制”完成深度克隆。

【何为深拷贝,何为浅拷贝】

java 中有两种数据类型(基本数据类型和类的实例对象这个引用数据类型)。用“=”赋值操作时候,对于基本数据类型,是拷贝值;对于引用数据类型,赋值的只是对象的引用,将原对象的引用传递过去,实际还是指向的同一个对象。

浅拷贝:拷贝对象的时候,只对基本数据类型进行了拷贝,而对引用类型进行引用的传递,没有真正创建一个新的对象。则认为是浅拷贝。

深拷贝:拷贝对象的时候,对基本数据类型进行了拷贝,对引用类型进行拷贝的时候,创建了一个新的对象,并且复制了其内的成员变量。则认为是深拷贝。

代码说明:同一个包下,有两个类:Person 类和Book 类,Book 类中有一个 Person 类的成员变量。代码分别实现浅拷贝和深拷贝。

Person 类代码:

package com.company;

public class Person implements Cloneable{
    String name;
    int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;

    }

    public void setName(String name){
        this.name = name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public String getName(){
        return this.name ;
    }

    public int getAge(){
        return this.age ;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Book 类代码:

package com.company;

public class Book implements Cloneable {
    //Book 类的成员变量,其中包含一个 Person类的 author 变量。
    String bookname;
    double price;
    Person author;

    public Book(String bn,double price,Person author){
        bookname = bn;
        this.price =  price;
        this.author = author;
    }

    //浅拷贝实现
//    @Override
//    public Object clone(){
//        Book b = null;
//        try{
//            b =  (Book) super.clone();
//        } catch (CloneNotSupportedException e){
//            e.printStackTrace();
//        }
//        return b;
//    }
    //深拷贝实现
    @Override
    public Object clone(){
            Book b = null;
            try{
                //调用 object 类对象的 clone()方法,返回一个 Object 类型的需要克隆的对象。
                b =  (Book)super.clone();
                //将Person 对象进行拷贝,Person 类也实现了 Clonable 接口
                b.author = (Person)this.author.clone();
            } catch (CloneNotSupportedException e){
                e.printStackTrace();
            }
            return b;
    }


    public static void main(String[] args) {
        Person p = new Person("Dream",34);
        Book book1 = new Book("java开发",30.00,p);
        //需要进行强制类型转换,clone()方法返回对象类型为 Object
        Book book2 = (Book) book1.clone();
        book2.price = 44.00;
        book2.author.setAge(45);
        book2.author.setName("Fish");
        book2.bookname = "android 开发";
        System.out.println("age= "+book1.author.getAge()+ " name= " + book1.bookname + "    price= "+book1.price);
        System.out.println();
        System.out.println("age= "+book2.author.getAge()+ " name= " + book2.bookname + "    price= "+book2.price);

    }
}

 

敲一遍代码并运行,一切明了。

 

参考地址:

https://www.cnblogs.com/plokmju/p/7357205.html
https://blog.csdn.net/qq_28929579/article/details/53965316

https://www.jianshu.com/p/8c74edbb46c0

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值