JAVA基础部分琐碎问题

1、面向对象的特征是?

  • 面向对象的特征是:
    • 抽象,把现实世界中的某一类东西,提取出来,用程序代码表示;
    • 封装,把过程和数据包围起来,对数据的访问只能通过已定义的界面;
    • 继承,一种联结类的层次模型;
    • 多态,允许不同类的对象对同一消息做出响应。”

2、this、static、super 能不能出现同一个方法中?

这三个不能同时出现在一个方法中

this、super 是否能在一方法中

  • this:是对对象的引用,前提是创建对象,super:是对父类的引用,前提是继承关系,this 和 super,调用构造函数时都必须放在类中的第一行代码上,所以它们不能出现在一起。(this通常指代当前对象,super通常指代父类 )

this、static、super是否能在一方法中

  • statsic 修饰则是静态的(方法、变量、对象),都是在类的加载的时候进行初始化的(已经加载到内存区),而 this、super 都是指向对象的,在类的初始化时,对象还没生成,但是程序会继续运行,则会调用 this 和 super(代表调用该方法的对象)所以就会报错。(还有种是:static修饰的是静态的代码,静态的不能去调用非静态的,在实例化对象时jvm会在堆区分配内存给一个具体的对象,this指针指向这个对象。而类中的static域始终是在静态区分配内存,this指向堆区,所以不能调用。static是属于类的。)
  • 如果在 statsic() 中使用了 super() 和 this() 则会爆出编译时错误

注:以上是本人的自己见解,未必正确和全面,可去网站进行查询

最后附上一代码程序

this的

class Aa{
    /**
     * 当:private int b; 时: Aa()的结果为:无参,第一个是 this.b,第二个是b:0 0
     * 当: private int b = 999; 时: Aa()的结果为:无参,第一个是 this.b,第二个是b:999 999
     */
    private int b =999;
    public Aa(){
         System.out.println("无参,第一个是 this.b,第二个是b:"+ this.b+" "+b);
    }
    public int test(int age){
        this.b=age;
        System.out.println("test中的 age:"+age);
        System.out.println("test中的 this.b:"+this.b);
        return this.b;
    }
}

class Bb{
    public static void main(String[] args) {
        Aa aa = new Aa();
        int Bage = aa.test(1);
        System.out.println("小猫年龄:"+Bage);
    }
}

super的

class Cc{
    public String name;
    public Cc(){
        System.out.println("无参");
    }
    public void test(){
        System.out.println("父类的name:"+name);
    }
}
class Dd extends Cc {
    public void Dtest(String dname){
        // 赋值
        super.name = dname;
        super.test();
        System.out.println("Dtest的super.name:"+super.name);
    }
}
class TestD{
    public static void main(String[] args) {
        Dd dd = new Dd();
        dd.Dtest("cp");
    }
}

混合

class  Person {
    Person() {
        System.out.println( "父类·无参数构造方法: " + "A Person.  1" );
    } //构造方法(1)

    Person(String name) {
        System.out.println( "父类·含一个参数的构造方法: " + "  3   A person's name is "  + name);
    } //构造方法(2)
}

class  Chinese  extends  Person {
    Chinese() {
        super ();  // 调用父类构造方法(1)
        System.out.println( "子类·调用父类”无参数构造方法“: " + "A chinese coder.   2" );
    }

    Chinese(String name) {  //this(name)调用的方法
        super (name); // 调用父类具有相同形参的构造方法(2)
        System.out.println( "子类·调用父类”含一个参数的构造方法“: " + " 4   his name is "  + name);
    }

    Chinese(String name,  int  age) {
        // 屏蔽则会默认调用 无参的构造方法  Chinese(){}
        this (name); // 调用具有相同形参的构造方法(3)  方法ABCD
        System.out.println( "子类:调用子类具有相同形参的构造方法:5  his age is   "  + age);
    }

    public  static  void  main(String[] args) {
        Chinese cn =  new  Chinese();
        cn =  new  Chinese( "codersai" );
        //System.out.println("end");
        // 调用时 调用到  方法ABCD  所以就会this(name)
        // 【this(参数)  调用本类中符合参数的方法】所以就会到 Chinese(String name){ ... } 中,所以就会运行 super(name)
        // 所以就会到 Person 类中的 Person(String name){ ... } 方法 所以就会在运行一次 3和4,
        // 最后运行 Chinese(String name,  int  age) { ... } 程序结束
        cn =  new  Chinese( "codersai" ,  18 );

    }
}

super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)

this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

super()和this()均需放在构造方法内第一行。尽管可以用this调用一个构造器,但却不能调用两个。

this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

注:根据

3、什么是继承

  • 关键字:extendes(可用在 class、interface 声明中,是表示后面的类是前面类的子类,但是java只能是单继承但可以多实现)
    • class:代指类—》.class
    • interface:接口,相当于是方法的集合,实现接口也就是实现类中所定义的方法,实现了接口的都必须实现其类中的所有方法
      • implements:实现,所代指要实现 interface 定义的类

继承

  • 特点:
    • 继承有一定的层次结构,有一定的可传递性
    • 子类继承父类所有的属性和方法,除私有的,父类的构造方法是用来创建父类的,子类无法继承
    • 子类除了可以拥有继承的属性、方法、也可拥有自己的属性、方法
    • JAVA 只支持单一的继承,只能有一个父类,但父类可以拥有多个子类
  • 好处
    • 提高了复用性,便于维护
  • 弊端
    • 类的耦合性增强,父类发生变化,子类也会变化
  • 场景
    • is…a的关系
  • 语法格式:
    • class 子类 extends 父类 { }
    • 子类可以拥有父类的非私有的成员
  • 在执行有继承关系的子类中,会先运行父类的无参的构造方法,再去执行子类的
  • super 父类(基类、超类):只能出现在继承关系的子类中
    • 作用:对当前父类对象的引用
    • 用法:
      • super.属性名、super.方法名(参数列表)
      • super(参数列表):指父类中的方法引用

4、什么是封装

  • 面向对象的特征:
    • 三大(封装、多态、继承)
    • 四大(封装、抽象、多态、继承)
  • 封装:
    • 就是包装,将抽象出来的数据进行包装,是为了数据的安全性
    • 主要作用就是为了在于对外隐藏内部的实现细节,增强程序的安全性
  • 包括:
    • 属性和方法的封装,但不是绝对的封装,留有指定的入口
  • 优点:
    • 可以减少耦合
    • 类内部的结构可以自由的修改
    • 可以对成员变量进行更精确的控制
    • 隐藏信息,实现细节
  • 白话:
    • 封装就是将公共通用的代码,装到一个类中,使用的时候直接引用即可,不用也没什么影响。

5、 多态的表现形式

  • 继承是根源
  • 重写,重载是表现形式
  • 重载:编译时多态
  • 重写:运行时多态

多态分为编译时多态和运行时多态这两种。

编译时多态:也称设计时多态,它是通过方法重载来实现的,编译器在编译状态可以进行不同行为的区分。

运行时多态则必须要求程序运行时,动态决定调用哪个方法,通过重写实现。 我们通常在Java中的多态指的就是运行时多态。

6、重写和重载

重写:

  • 只能是子类重新父类中的方法,返回值和形参都不能改变。即外壳不变,核心重写!
  • 好处:子类可以定义字节的行为(根据需要实现父类的方法)
  • 重写方法不能抛出新的检查异常或者范围更加宽泛的异常

方法重写规则

  • 参数列表与被重写方法的参数列表必须完全相同。
  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
  • 父类的成员方法只能被它的子类重写。
  • 声明为 final 的方法不能被重写。
  • 声明为 static 的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个类,则不能重写该类的方法。

重载

  • 在一个类中,多个方法名一致,但参数列表不同
  • 不能通过返回值来判断两个方法是否重载
  • 【返回值一样不一样都可,但方法重载必须是参数列不同方法名相同

方法重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

根据菜鸟技术

7、TCP 和 UDP 协议

  • TCP 协议

    • TCP(Transmission Control Protocol,传输控制协议)被称作一种端对端协议。是一种面向连接的、可靠的、基于字节流的传输层的通信协议,可以连续传输大量的数据。
    • TCP协议会采用“三次握手”方式让它们建立一个连接。
    • 数据传输完毕TCP协议会采用“四次挥手”方式断开连接。
  • UDP 协议

    • UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务

    UDP协议是一种面向非连接的协议 UDP协议是一种不可靠的协议

    1、基于UDP协议的网络编程
    • 基于UDP协议的网络编程仍然需要在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送、接收的数据报。
    • 发送端
    • 步骤流程:
      • 建立发送端的DatagramSocket,需要指定本端的端口号
      • 建立数据包DatagramPacket
        • 数据
        • 接收端的IP地址
        • 接收端的端口号
      • 调用DatagramSocket的发送方法
      • 关闭DatagramSocket
    • 接收端
    • 步骤流程:
      • 建立接收端的DatagramSocket,需要指定本端的IP地址和端口号
      • 建立数据包DatagramPacket
        • 需要指定装数据的数组
      • 调用Socket的接收方法
      • 拆封数据
      • 关闭Socke
    2、使用MulticastSocket实现多点广播
    • Datagram只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端。
    • IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255。

8、HashMap 和 HashTable

HashMap

  • HashMap 存储数据采用的是哈希表结构,元素无序,每一个元素都是 key-value其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
  • HashMap由数组+链表组成的,数组是HashMap的主体 。
  • 元素不重复,需要重写键的hashCode方法和equals方法。元素无序,但是查询速度快,HashMap允许 key和value 都为空(null)
  • HashMap 是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
  • HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
  • HashMap存数据的过程是:
    • HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。
  • .HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。

HashTable

  • Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
  • Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
  • Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

不同

  • 继承父类不同
    • HashMap继承自AbstractMap类。但二者都实现了Map接口。 Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。
  • HashMap线程不安全,HashTable线程安全
  • 包含的contains方法不同
    • HashMap是没有contains方法的 ,hashtable则保留了contains方法,
  • Hashmap是允许key和value为null值的,HashTable键值对都不能为空,否则包空指针异常。
  • 计算hash值方式不同
  • 扩容方式不同(容量不够)
  • 解决hash冲突方式不同(地址冲突 )

注:详细请去一探究竟

9、ArrayList、LinkedList

  • List 接口的主要实现类:

    • java.util.ArrayList
    • java.util.LinkedList
    • java.util.Vector
  • ArrayList集合
    • 存储结构是:动态数组,容量会自动的改变
    • 查找快:索引
    • 增删慢:增删一个元素都要将该位置以后的元素进行所有的调整
  • LinkedList集合

    • 存储结构:链表结构,方便添加、删除的集合
    • 是一个双向链表集合
    • 有大量首尾操作的方法(添加、删除)
  • Vector集合

    • 与ArrayList集合几乎一致,但是是线程安全的,效率慢

10、Java中的 final、finally、finalize

  • final 修饰符,关键字:最终的、不可变的:final可以用于类、方法、变量。

    • final 修饰类:代表改类不能被继承(不能有子类,但可以有父类)
    • final 修饰方法:不能被重写
    • final 修饰变量:是一个静态的常量,不能被再次赋值
    • final 修饰方法中的参数:该参数是最终参数,在方法体中不能再次赋值
    • final 修饰基本数据类型变量:指的是 基本数据类型的值不再发生改变
    • final 修饰引用数据类型变量:指的是应引用类型的地址值不再改变,但是 其内容可以进行改变
  • finally:异常处理结构的一部分,在 finally 里的代码代表总是执行

    • 一般在 try/catch 语句中,并且附带一个语句块(一般是代表最终一定会进行执行)

    关于 finally 里的代码会不会一定执行,可去大佬文章观看

  • finalize 方法名:这是一个在 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收

  • final 是关键字,finally 是 try/catch 代码块中的一种,finalize 是方法

11、更多基础可以到此处查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值