Java常见问题

java三大特性

  https://www.cnblogs.com/BoscoGuo/p/5877185.html
  • 继承性:被子类覆写的方法不能有比父类更严格的访问控制权限 方法权限:public、default、private 如果父类是public,则子类必须是public 权限上必须是子类权限大于父类权限。比如父类default,子类public是可以的,但父类是private,子类时public是不可以的,因为private方法对子类不可见,不可以实现覆写,写了相当于在子类新定义了一个方法。子类在覆写父类方法后若还想使用父类方法使用super.方法名();
  • 在子类构造中使用super()的原因:父类构造中没有明确书写无参构造。
    this.方法名()与super.方法名()的区别:this.方法名()首先看本类中是否有该方法,如果没有,查看父类中该方法,如果有则调用,没有则出现错误
    super.方法名()只查找父类。
    https://www.cnblogs.com/liujinhong/p/6003144.html(多态的深入理解)。
    多态存在的三个必要条件
    一、要有继承;
    二、要有重写;
    三、父类引用指向子类对象。

重载与重写

https://www.jb51.net/article/96424.htm
重载是编译时多态(根据调用方的参数进行绑定调用方法,典型应用是构造函数),重写是运行时多态。重写的方法参数列表必须相同,重载不是,重载的方法访问控制权限和异常抛出没有限制,重写的异常范围必须小于父类,方法访问控制权限必须不低于父类(由于多态时向上转型,如果子类方法的权限变低将会造成导致向上专项出现错误。

this与super的区别

https://www.cnblogs.com/hasse/p/5023392.html

Java的抽象类与接口

https://www.cnblogs.com/dolphin0520/p/3811437.html
一.抽象类
  抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
  1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
  2)抽象类不能用来创建对象;
  3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
  在其他方面,抽象类和普通的类并没有区别。
二.接口
  接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
  要让一个类遵循某组特地的接口需要使用implements关键字,允许一个类遵循多个特定的接口如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
三.抽象类和接口的区别
1.语法层面上的区别
  1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法
  4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别(重点)
  1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象继承是一个 "是不是"的关系而 接口 实现则是 "有没有"的关系如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系
  2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

final关键字

修饰的类不能被覆盖,修饰的方法不能被重写,修饰的变量必须赋初值。

final、finallize、finally

final
修饰符(关键字)如果一个类被声明为final,不能被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally
异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。一般异常处理块需要。
finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
Java中所有类都从Object类中继承finalize()方法。
当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法。但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行显然指望它做收尾工作是靠不住的。它最主要的用途是回收特殊渠道申请的内存。

Object类中的所有方法

https://blog.csdn.net/qq_30264689/article/details/81903031
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这是就需要在类中复写clone方法。
https://www.cnblogs.com/acode/p/6306887.html(关于clone()的深复制与浅复制问题)
2.getClass方法
final方法,获得运行时类型
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用
5.equals方法
该方法是非常重要的一个方法。一般equals和等于号(Object.java中。通过判断两个对象的地址是否相等来区分它们是否相等)是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到
一般必须满足
obj1.equals(obj2)=true。可以推出obj1.hashCode()=obj2.hashCode(),但是hashCode相等不一定就满足equals
。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。

equals(覆写方法),==,hashcode

https://www.cnblogs.com/skywang12345/p/3324958.html
(1)equals和==
”是指两个对象的地址相同,即指同一对象。equals不覆写和“”一样,一般为了表示对象的值相同需要在*类 *中覆写equals方法。
覆写方式:

import java.util.*;
import java.lang.Comparable;

/**
 * @desc equals()的测试程序。
 *
 * @author skywang
 * @emai kuiwu-wang@163.com
 */
public class EqualsTest3{

    public static void main(String[] args) {
        // 新建2个相同内容的Person对象,
        // 再用equals比较它们是否相等
        Person p1 = new Person("eee", 100);
        Person p2 = new Person("eee", 100);
        System.out.printf("p1.equals(p2) : %s\n", p1.equals(p2));
        System.out.printf("p1==p2 : %s\n", p1==p2);
    }

    /**
     * @desc Person类。
     */
    private static class Person {
        int age;
        String name;

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

        public String toString() {
            return name + " - " +age;
        }

        /** 
         * @desc 覆盖equals方法 
         */  
        @Override//重点
        public boolean equals(Object obj){  
            if(obj == null){  
                return false;  
            }  
              
            //如果是同一个对象返回true,反之返回false  
            if(this == obj){  
                return true;  
            }  
              
            //判断是否类型相同  
            if(this.getClass() != obj.getClass()){  
                return false;  
            }  
              
            Person person = (Person)obj;  
            return name.equals(person.name) && age==person.age;  
        } 
    }
}

(2)hashcode和equals

  • hashCode() 的作用是获取哈希码,也称为散列码;虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建并某个“类的散列表”时,该类的hashCode() 才有用(作用是:确定该类的每一个对象在散列表中的位置;其它情况下,类的hashCode() 没有作用。
  • hashcode和equals的关系
    1、不会创建“类对应的散列表”该类的“hashCode() 和 equals() ”没有半毛钱关系的!这种情况下,equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用,所以,不用理会hashCode()。
    2、“会创建类对应的散列表”是说:我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,会创建该类的HashSet集合。
    在这种情况下,该类的“hashCode() 和 equals() ”是有关系的:
    1)、如果两个对象相等,那么它们的hashCode()值一定相同
    这里的相等是指,通过equals()比较两个对象时返回true。
    2)、如果两个对象hashCode()相等,它们并不一定相等
    因为在散列表中,hashCode()相等,即两个键值对的哈希值相等然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。
    此外,在这种情况下。若要判断两个对象是否相等,除了要覆盖equals()之外,也要覆盖hashCode()函数。否则,equals()无效
    一个对象要放进hashmap或hashset中必须先要覆写equals和hashcode方法。如果只覆写equals方法,在将元素放入hashset中可能由于hashcode不同而加入重复元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值