目录
子类继承父类,然后再多往下被继承一次,对这三个实例化,没问题
因为java继承中是支持多层继承的(注意不支持多重继承)
写子类构造方法,必须要用super
具体还不明白的铁子,可以看我这篇博客,里面对于继承有很好的分析
我之前对于子类构造是这样总结的
子类对象成员是由两部分组成:
🟧子类对象构造时,需要先调用父类构造方法,将从父类继承下来的成员构造完整,
然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。
⚜️提几点注意:
🤠(1)如果父类执行默认的构造方法,那么在子类构造方法的第一行默认含有super()的调用
🤠(2)如果父类构造方法是带有参数的,此时编译器给子类不会执行默认的构造方法,
这就要程序员自己给子类定义构造方法了
🤠(3)在子类构造方法中,super()调用父类构造时,必须是子类构造方法中第一条语句。
🤠(4)super()只能在子类构造方法中出现一次,并且不能和this同时出现
==比较的是地址 , str1 是放在常量池中的,而str2 这里有new所以是放堆中的,两个指向的不是一个对象
== 比较的是地址!!! 不要看内容一样就选true!!!
题目链接:字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com)
题目要求:
题目分析:
上代码
- import java.util.Scanner;
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- String str = in.nextLine();
-
- String cur = "";
- String ret = "";
-
- for(int i = 0; i < str.length(); i++) {
- char ch = str.charAt(i);
- if(ch >='0' && ch <= '9') {
- cur += ch;
- }else {
- if(cur.length() > ret.length()) {
- ret = cur;
- }
- cur = "";
- }
- }
- //走到这里还需要比较一次,因为
- //如果i走到最后面有一个最长的数字字符串,这只会存到cur中
- if(cur.length() > ret.length()) {
- ret = cur;
- }
- System.out.println(ret);
- }
- }
题目链接:数组中出现次数超过一半的数字_牛客题霸_牛客网 (nowcoder.com)
题目要求:
题目分析:
两个思路
(1)排序
a)先排序,找到中间的数字X
b)再次遍历这个数组,看一下这个X出现了多少次
如果存在,那么遍历的结果,这个数字肯定会出现次数超过一半
(2)两个数字相抵消
如果两个数字不相等,就消去这两个数,最坏情况下
每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数
在最后剩下的这个数,还需要再遍历一下,看这个数出现的次数超过一半了没
如果超过了一半,那就存在,如果没超过一半。就不存在
上代码
(1)排序
- import java.util.Arrays;
-
- public class Solution {
- public int MoreThanHalfNum_Solution(int [] array) {
- if(array == null || array.length == 0) {
- return 0;
- }
-
- Arrays.sort(array);
- int len = array.length;
- int count = 0;
- for(int i = 0; i < len; i++) {
- if(array[len/2] == array[i]) {
- count++;
- }
- }
- if(count > len/2) {
- return array[len/2];
- }
- return 0;
- }
- }
(2)两个数字相抵消
- import java.util.Arrays;
-
- public class Solution {
- public int MoreThanHalfNum_Solution1(int [] array) {
- if(array == null || array.length == 0) {
- return 0;
- }
-
- Arrays.sort(array);
- int len = array.length;
- int count = 0;
- for(int i = 0; i < len; i++) {
- if(array[len/2] == array[i]) {
- count++;
- }
- }
- if(count > len/2) {
- return array[len/2];
- }
- return 0;
- }
-
- public int MoreThanHalfNum_Solution(int [] array) {
- if(array == null || array.length == 0) {
- return 0;
- }
-
- int result = array[0];
- int times = 1;
-
- for(int i = 1; i < array.length; i++) {
- if(times != 0) {
- if(array[i] != result) {
- times--;
- }else {
- times++;
- }
- }else {
- result = array[i];
- times = 1;
- }
- }
-
- int count = 0;
- //再次判断剩下的这个数,有没有数组长度的一半
- for(int i = 0; i < array.length; i++) {
- if(array[i] == result) {
- count++;
- }
- }
- if(count > array.length/2) {
- return result;
- }
- return 0;
- }
- }
题目链接: 另类加法__牛客网 (nowcoder.com)
题目要求:
题目分析:
上代码
- import java.util.*;
-
- public class UnusualAdd {
- public int addAB(int A, int B) {
- if(B == 0) {
- return 0;
- }
- int sum = 0;//本位
- int carray = 0;//进位
- while(B != 0) {
- sum = A^B;
- carray = (A&B)<<1;
- A = sum;
- B = carray;
- }
- return A;
- }
- }
这个题选 A、C、D
这个先回顾一下,接口的特性
(1)接口当中的成员变量,默认都是 public static final 修饰的
(2)接口中的成员方法,默认都是抽象方法,也就是public abstract 修饰的
(3)接口中的普通成员方法,是不能有具体的实现的
(4)接口中的普通成员方法,如果要有具体实现,就必须加上default【从JDK8开始】
(5)接口中可以有静态的成员方法,但是不管是静态方法还是default方法都是public修饰
(6)接口本身也是不可以进行实例化的
(7) 类和接口的关系是使用 implements 来关联的
(8)接口中不能有静态代码块,实例代码块,构造方法
(9)一个抽象类实现一个接口,可以不重写这个抽象方法,但是这个类一旦被使用,就也要重写构造方法
针对这个题来说,
所以,选ACD,我当时做的时候选了个C、D,没选A是因为看见了main方法,以为接口中是不能有main方法的,现在看来这个main方法没有实现啊!!!
这道题选B、C
接口不能被final修饰,接口的作用就是被实现重写的
而final的作用就是
(1)final修饰类:表示该类不能被继承(修饰的类也叫做“断子绝孙类”)
(2)final修饰方法:表示方法不能被重写(但可以被继承)
(3)final修饰变量:表示变量只能一次赋值以后,值不能被修改(常量)
a. 当final修饰的是基本数据类型:这个数据的值在初始化后将不能被改变
b. 当final修饰的是引用数据类型:修饰一个对象时,引用在初始化后将永远指向一个内存地址,不能被修改。但是该内存地址中保存的对象信息,是可以进行修改的
也就是基本数据类型,值不能改;引用数据类型,地址不能改,内容可以改
题目链接:计算糖果_牛客题霸_牛客网 (nowcoder.com)
题目要求:
题目分析:
上代码
- import java.util.Scanner;
-
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int[] array = new int[4];
- for(int i = 0; i < 4; i++) {
- array[i] = in.nextInt();
- }
- int A,B,C,D;
- A = (array[0] + array[2])/2;
- B = (array[1] + array[3])/2;
- C = (array[3] - array[1])/2;
-
- if((array[0] == A - B) && (array[1] == B - C) && (array[2] == A + B) && (array[3] == B + C)) {
- System.out.println(A + " " + B +" " + C);
- }else {
- System.out.println("No");
- }
- }
- }
题目链接:进制转换_牛客题霸_牛客网 (nowcoder.com)
题目要求:
题目分析:
上代码
- import java.util.Scanner;
-
- public class Main {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int m = in.nextInt();
- int n = in.nextInt();
-
- StringBuilder sb = new StringBuilder();
- String table = "0123456789ABCDEF";
- boolean flag = true;
- if(m == 0) {
- System.out.println("0");
- }
- if(m < 0) {
- m = -m;
- flag = false;
- }
- while(m != 0) {
- sb.append(table.charAt(m%n));
- m /= n;
- }
-
- if(!flag) {
- sb.append("-");
- }
-
- System.out.println(sb.reverse().toString());
- }
- }
效率:System.arraycopy > clone > Array.copyOf > for
(1)System.arraycopy:这个方法是一个本地方法,也就是native方法,对应的实现不在当前文件里,而是在其他语言实现的的文件的,比如C、C++中。也就是native方法+JVM手写函数,在JVM里预写好速度最快
(2)Array.copyOf:注意这里是错误的,应该是Arrays.copyOf。
首先明确Array中没有copyOf,而Arrays中有copyOf
再看一个Arrays的copyOf源码,里面调用了System.arraycopy
相当于多了一层,那肯定是不如System.arraycopy快
(3)clone
native方法,但并未手写,需要JNI转换,速度次与System.copyOf
(4)for全是深复制,并且不是封装方法,所以最慢
这块可以看一下这篇博客写的挺好的