Java基础整理(十一)

本文介绍了Java编程中的包机制,包括其作用、使用方式和命名规范。接着讨论了访问控制权限,如private、public、protected及默认权限的适用范围。此外,详细讲解了Object类的toString()和equals()方法,并探讨了匿名内部类的概念及其应用。文章强调了重写toString()和equals()的重要性,以及匿名内部类在代码可读性方面的局限性。
摘要由CSDN通过智能技术生成

包机制、访问控制权限、Object类、匿名内部类

包机制

  • 为什么使用package?

    package是java中包机制。包机制的作用是为了方便程序的管理。不同功能的类分别存放在不同的包下。

  • package怎么用?

    package是一个关键字,后面加包名

    package com.baidu.javase
    

    package语句只允许出现在java源代码的第一行

  • 包名有没有命名规范?

    一般都采用公司域名倒叙的方式

    公司域名倒序 + 项目名 + 模块名 + 功能名
    
  • import使用

    • import什么时候用?

      A类中使用B类

      A类和B类都在同一个包下,不需要imprt

      A类和B类不在同一个包下,需要import

      java.lang.*;这个包下的类不需要使用import导入

    • import怎么使用?

      import语句只能出现在package语句之下,class声明语句之上,也可以采用星号的形式

      import java.util.* //这个效率不低,因为编译器编译时,会自动把*转换为具体的类
      

访问控制权限

  • 访问控制权限有哪些?

    private(私有)、public(公开)、protected(受保护)、默认

  • 4个访问控制权限的范围

    • private表示私有,只能在本类中访问
    • public表示公开,在任何位置可以访问
    • “默认”表示只能在本类、以及同包下访问
    • protected只能在本类、同包、子类中访问
    • public > protected > 默认 > private
  • 访问控制权限修饰符可以修饰什么?

    • 属性(4个都可以使用)
    • 方法(4个都可以使用)
    • 类(pubic和默认可以使用、其他不行)
    • 接口(pubic和默认可以使用、其他不行)

Object类

任何一个类都默认继承Object

1. toString()方法

  • 源代码

    public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
     }//类名@对象的内存地址转换为十六进制的形式
    
  • 作用

    通过调用这个方法可以将一个“java对象”转换成“字符串”形式,建议所有子类重写toString()方法

    public class Student {
        
        private int id;
        private String name;
        
        public String toString(){
            return "学号:" + id + ",姓名" + name;
        }
        
    }
    

2. equals()方法

  • 源代码

     public boolean equals(Object obj) {
            return (this == obj);
        }
    
  • 作用

    通过equals方法来判断两个对象是否相等

    但是,在Object类中的equals方法当中,默认使用 ” == “ 判断两个java对象是否相等。而 ” == “判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等,所以我们还是要重写equals方法

    public class Student {
    
         int id;
         String name;
        
        public Student(){
            
        }
        public Student(int id , String name){
            this.id = id;
            this.name= name;
        }
    
        public boolean equals(Object obj){
            if(obj==null || !(obj instanceof Student))
                return false;
            if(this==obj) //地址相同 指向的内容一定相同
                return true;
            Student s=(Student)obj;
            if(id==s.id&&name.equals(s.name))
                return true;
            return false;
        }
    }
    
    

匿名内部类

  • 什么是内部类?

    在类的内部又定义一个新类,称为匿名内部类

  • 内部类的分类

    • 静态内部类:类似于静态变量
    • 实例内部类:类似于实例变量
    • 局部内部类:类似于局部变量(匿名内部类属于局部内部类中的一种)
    class Test{
        
        static class Inner1{
            //静态内部类
        }
        
        class Inner2{
            //实例内部类
        }
        
        public void doSome(){
            
            class Inner3{
                //局部内部类
            }
            
        }
        
    }
    
  • 匿名内部类实例

    public class Demo{
    
        public static void main(String[] args) {
    
            Math m = new Math();
            m.mySum(new Menu() { //匿名内部类 表示这个类没有名字
                @Override        //表面上看上去是接口new了,实际不是,后面的{}代表了对接口的实现
                public int sum(int a, int b) {
                    return a+b;
                }
            },20,30);
    
        }
    }
    
    public interface Menu {
    
        int sum(int a,int b);
    
    }
    
    
    class Math{
    
        public void mySum(Menu m,int x,int y){
            int result=m.sum(x,y);
            System.out.println(x + "+" + y + "=" + result);
        }
    
    }
    

    以上方法等价于:

    public class Demo{
    
        public static void main(String[] args) {
    
            Math m = new Math();
            m.mySum(new MenuImpl(),20,30);
    
        }
    }
    
    class Math{
    
        public void mySum(Menu m,int x,int y){
            int result=m.sum(x,y);
            System.out.println(x + "+" + y + "=" + result);
        }
    
    }
    
    public interface Menu {
    
        int sum(int a,int b);
    
    }
    
    
    public class MenuImpl implements Menu {
        @Override
        public int sum(int a, int b) {
            return a+b;
        }
    }
    

    总结:为什么不建议使用匿名内部类?

    因为一个类没有名字,没有办法重复使用,代码太乱,可读性差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值