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 是方法