zoukankan      html  css  js  c++  java
  • Java暑期学习第十三天日报

    一、今日学习的内容:

        今天学习了5.1和5.2的内容。5.1是类的继承,5.2是Java中的多态变化。

    二、遇到的问题:

     对于Java中对象的克隆理解和应用上存在一些问题,其主要问题在深层克隆,我对此需要在这方面的例题上多练习。另外关于object类中的常用方法不是很熟悉。

    三、明日计划:

        明天计划学习5.3和5.4的内容。

     

    今天具体学习的内容如下:

     1.Object类及其方法:

    (1)Object类是所有Java类的父类,定义如下 public class Object    ,Object类是类层次结构的根类。

    Object类的常用方法如下:

    Object常用方法

    说明

    protected Object clone()

                                   throws

    CloneNotSupportedException 

    创建并返回此对象的一个副本
    public boolean equal(Object obj) 指示其他某个对象是否与该对象相等
    public final Class<?>getClass()

    返回此Object类的运行时类,返回的Class对象是由

    static synchronized方法锁定的对象

    public final void notify() 唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,咋会选择唤醒其中一个线程,选择是任意性的,并在对实现做出决定时发生县城通过调用其中一个wait的方法,在对象的监视器上等待
    public final void notifyAll() 唤醒在此对象监视器上等待的所有线程,并在对实现做出决定时发生县城通过调用其中一个wait的方法,在对象的监视器上等待
    public String toString() 返回该对象的字符串表示通常to string方法会返回一个以“文本方式表示”此对象的字符串,结果应是一个简明但易于读懂信息表达式,建议所有子类都重写该方法

    2.对象的克隆

    (1)克隆的限制

    克隆的限制

    被克隆的类必须自己实现Cloneable接口,以指示

    Object.clone()方法可以合法的对该实例进行按字

    段复制,其中Cloneable只是个标识接口,并没有任何接口方法

    实现Cloneable接口的类应该使用公共方法重写Object.clone()。

    在Java.lang.Object类中克隆方法如下:

    protected Object clone()

    throws CloneNotSupportedException

    创建并返回此对象的一个副本,按照惯例返回的类应该通过super.clone调用

    (2)Java克隆的分类

    浅层克隆 主要复制基本对象的值
    深层克隆

    当类存在聚合关系时,克隆时就必须考虑

    聚合对象的克隆。可复制引用类型的字段

    浅层克隆实例:

    public class clone1 {
        public static void main(String [] args) throws CloneNotSupportedException{
            Person p=new Person(21,"小明");
            Person p2=(Person)p.clone();
            System.out.println("克隆前:"+p.getName()+","+p.getAge());
            System.out.println("克隆后:"+p2.getName()+","+p2.getAge());
            
            if(p==p2)
                System.out.println("p和p2的地址相同");
            else
                System.out.println("p和p2的地址不同");
                
        }
    
    }
    
     class Person implements Cloneable{
        private int age;
        private String name;
        public Person(int a,String s) {
            age=a;
            name=s;
        }
        public void setAge(int age) {
            this.age=age;
        }
        public int getAge() {
            return age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name=name;
        }
        @Override
        protected Object clone() throws CloneNotSupportedException{
            return super.clone();
        }
        
    }

    测试截图

    深层克隆实例:

    public class clone2 {
        public static void main(String [] args) throws CloneNotSupportedException{
            Person per=new Person(13,"小力");
            P p=new P(per);
            P p2=(P)p.clone();
            
            System.out.println("克隆前:"+p.getper().getName()+","+p.getper().getAge());
            System.out.println("克隆后:"+p2.getper().getName()+","+p2.getper().getAge());
            
            if(p==p2)
                System.out.println("p和p2的地址相同");
            else
                System.out.println("p和p2的地址不同");
            if(p.getper()==p2.getper())
                System.out.println("p中的Person对象和p2中的Person对象相等!");
            else
                System.out.println("p中的Person对象和p2中的Person对象不相等!");
                
        }
    
    }
    
     class P implements Cloneable{
        Person per;
        public P(Person per) {
            this.per=per;
        }
        public Person getper() {
            return per;
        }
        public void setper(Person per) {
            this.per=per;
        }
        @Override
        protected Object clone() throws CloneNotSupportedException{
            P p=(P)super.clone();
            p.per=(Person)this.per.clone();
            return p;
        }
        
    }

    测试截图:

    3.Java的继承

    Java中的继承使用关键字extends,形式为:class 子类 extends 父类 { }

    子类可以享有父类中的非私有方法和非私有属性。

    实例如下:

    package atm;
    
    public class person {
        public String name;
        public int age;
        public String sex;
        public void setName(String name) {
            this.name=name;
        }
        public void setAge(int age) {
            this.age=age;
        }
        public void setSex(String sex) {
            this.sex=sex;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public String getSex() {
            return sex;
        }
    
    }
     
    public class student extends person {
        private String department;
        private String specialty;
        public static void main(String []args) {
            student s=new student();
            s.setName("小飞");   //调用父类中的方法
            s.setAge(17);         //调用父类中的方法
            s.setSex("男");        //调用父类中的方法
            String A=s.getSex();   //调用父类中的方法
            int n=s.getAge();
            String str=s.name;  //调用父类中的属性
            System.out.println("姓名:"+str);
            System.out.println("性别:"+A);
            System.out.println("年龄:"+n);
        }
    
    }

    测试截图:

    4.super关键字

    子类可以使用super关键字对父类的非私有属性和方法进行访问,还可以调用父类的构造函数。

    super关键字调用父类的属性和方法:

    package atm;
    
    public class person {
        public String name;
        public int age;
        public String sex;
        public void setName(String name) {
            this.name=name;
        }
        public void setAge(int age) {
            this.age=age;
        }
        public void setSex(String sex) {
            this.sex=sex;
        }
        public String getName() {
            return name;
        }
        public int getAge() {
            return age;
        }
        public String getSex() {
            return sex;
        }
    
    }
    public class student extends person {
        private String department;
        private String specialty;
        String name=super.name ; //调用父类的属性name
        String sexl=sex;
        public void test() {
            super.getAge();     //调用父类的方法
            getName();
        }
    
    
    }

    使用super关键字调用父类的构造函数

    super() 调用的是父类的无参构造函数,super(参数)调用的是含参构造函数

    public class person2 {
        public String name;
        public int age;
        public person2() {
            
        }
        public person2(String name,int age) {
            this.name=name;
            this.age=age;
        }
        
        
    }
    public class student2 extends person2{
        public student2() {
            super("小米",15);
            
        }
        public static void main(String[] args) {
            student2 s=new student2();
            String str=s.name;
            int a=s.age;
            System.out.println("姓名:"+str);
            System.out.println("年龄:"+a);
        }
    
    }

    5.多态

    (1)Java中多态的的体现具体表现在重载和覆盖。覆盖是指子类重写了父类的方法,但子类方法重写时修饰符的权限要大于或等于父类的修饰符权限。

    (2)类型检测:

    向上转型 父类 对象=new 子类();
    向下转型

    父类 对象1=new 子类();

    子类 对象2=(子类)对象1;

    当子类中特有一个方法时,使用向上转型会丢掉子类中特有的方法,此时需要用到向下转型。

    6.动态绑定

    (1)动态绑定具体体现在向上转型上。而关于静态绑定,Java中的变量都是静态绑定的,只有private,static,final是静态绑定的。

  • 相关阅读:
    真的是简单、简洁、简易、简明之道!!!
    HashMap源码解读
    Jenkins Pipeline
    C语言二级指针free|一级指针存储内存地址
    openjdk编译和调试,JVM编译调试
    java linux和win jdk安装包jdk1.6、jdk1.7和jdk1.8 7u80 8u181 8u161
    关于java代码打包成jar在控制台运行变慢的问题
    Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen
    mongodb副本集
    condition
  • 原文地址:https://www.cnblogs.com/Lizhichengweidashen/p/13337641.html
Copyright © 2011-2022 走看看