天啊!宝藏!
在 IDEA 中, shift
+ enter
可以直接换行而不会把光标后面的内容移到下一行。
找了好久的快捷键!!今天因为机缘巧合按错键然后被我发现了。
可以让文字有一个小小的背景,在文字中介绍重要的类名、关键字、方法名的时候可以使用,以突出他们。养成这个习惯也可以让文章变的易读。
文字中,英语与汉字、数字与汉字直接最好有一个空格,这样比较美观。举例如下
我是 1 只学习 java 的 panda。
我是1只学习java的panda。
明显第一句看起来舒服的多!
使用 import
关键字来声明。
当导入的两个有相同类名的类库,创建这个相同类时,就会产生冲突。
解决方法是在类名前面加入类库名,指明这个类的位置。
public
关键字表示后面的成员对于每个人都是可用的。
private
关键字表示除了包含该成员的类,其它任何类都无法访问这个成员。
####protected
protected
关键字是指,该成员只能被包含该成员的类类及其子类访问。
在创建一个类时,以 public → protected → private 为顺序编写哥成员。好处是,类的使用者可以从头读起,先看到权限最大的部分(public),然后权限递减。
ArrayList
类ArrayList 类相当于数组的加强版。普通数组经常会因为其大小无法更改而出现各种各样的不方便, ArrayList 类的引入可以解决这个问题。
ArrayList<T> list = new ArrayList<T>();
int n = list.size();
String s = list. get(3)
list.set(3,s);
依据下图的类层次结构的定义,创建相应的类和接口,并实现两种不同的多态:重载和重写。
创建五个接口、三个类和两个对象;
人类实现吃饭、喝水、睡觉三个接口;
男人实现刮胡子接口,女人实现生孩子接口,男人类和女人类同时也要实现吃饭、喝水、睡觉三个接口;、李雷 重载刮胡子接口(如增加不同数量和类型的参数),韩梅梅 重写生孩子接口(如剖腹产和顺产不同的行为)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ou3A59om-1634828901564)(https://img-community.csdnimg.cn/images/758719819dc44ab2a91bf9911d2c766f.png “=600 #left”)]
模仿上一题的类层次结构的定义,创建另一组类和接口(例如宠物-猫狗、衣服-男装女装等),同样按照上一题的要求实现。
package com.xxm.Task4;
/*
依据下图的类层次结构的定义,创建相应的类和接口,并实现两种不同的多态:重载和重写。
创建五个接口、三个类和两个对象;
人类实现吃饭、喝水、睡觉三个接口;
男人实现刮胡子接口,女人实现生孩子接口,男人类和女人类同时也要实现吃饭、喝水、睡觉三个接口;
李雷 重载刮胡子接口(如增加不同数量和类型的参数),
韩梅梅 重写生孩子接口(如剖腹产和顺产不同的行为)。
*/
public class Task4_1 {
public static void main(String[] args) {
class Human implements Eat, Drink, Sleep {
public void eat() {
System.out.println("吃饭");
}
public void drink() {
System.out.println("喝水");
}
public void sleep() {
System.out.println("睡觉");
}
}
class Man extends Human implements Shave {
public void shave() {
System.out.println("刮胡子");
}
}
class Woman extends Human implements GiveBirthToABaby {
public void giveBirth() {
System.out.println("生孩子");
}
}
class Lilei extends Man{
public void shave(int n) {
System.out.println("每" + n + "天刮一次胡子");
}
public void shave(String brand, int n) {
System.out.println("每" + n + "天用" + brand + "牌剃须刀刮一次胡子");
}
public void shave(String brand) {
System.out.println("每天用" + brand + "刮胡子");
}
}
class Hanmeimei extends Woman{
@Override
public void giveBirth(){
System.out.println("剖腹产");
}
}
Lilei lilei = new Lilei();
Woman hanmeimei = new Hanmeimei();
/*
其实这段代码可以运行
Woman hanmeimei = new Woman() {
@Override
public void giveBirth() {
System.out.println("剖腹产");
}
};
*/
lilei.eat();
lilei.drink();
lilei.sleep();
lilei.shave(365);
lilei.shave("吉列");
lilei.shave("吉列",1);
hanmeimei.eat();
hanmeimei.drink();
hanmeimei.sleep();
hanmeimei.giveBirth();
}
//吃饭接口
public interface Eat {
void eat();
}
//喝水接口
public interface Drink {
void drink();
}
//睡觉接口
public interface Sleep {
void sleep();
}
//刮胡子接口
public interface Shave {
void shave();
}
//生孩子接口
interface GiveBirthToABaby {
void giveBirth();
}
}
package com.xxm.Task4;
public class Task4_2 {
public interface Eat {
void eat();
}
public interface Sleep {
void sleep();
}
public interface Run {
void run();
}
public interface Play {
void play();
}
public interface EatAllTheDay {
void eatAllTheDay();
}
public interface SleepAllTheDay {
void sleepAllTheDay();
}
public static void main(String[] args) {
class Cat implements Eat, Sleep, Run, Play {
@Override
public void eat() {
System.out.println("yumm");
}
@Override
public void run() {
System.out.println("run!!");
}
@Override
public void sleep() {
System.out.println("zzZ");
}
@Override
public void play() {
System.out.println("砰砰砰,轰隆隆");
}
}
class LazyCat extends Cat implements SleepAllTheDay {
@Override
public void sleepAllTheDay() {
System.out.println("zzzzzzzzzzZZZZZZZ(for the whole day)");
}
}
class OrangeCat extends Cat implements EatAllTheDay {
@Override
public void eatAllTheDay() {
System.out.println("yumyumyumyum");
}
}
class Pig extends OrangeCat {
@Override
public void play() {
System.out.println("yummyumm");
}
public void eat(int a) {
System.out.println("我已经 " + a + " 秒没吃饭了");
}
}
class LadyLazy extends LazyCat {
@Override
public void play() {
System.out.println("zzzZZZ");
}
}
Pig piggy = new Pig();
LadyLazy ladyLazy = new LadyLazy();
piggy.run();
piggy.eat();
piggy.eat(3);
piggy.play();
piggy.eatAllTheDay();
piggy.sleep();
ladyLazy.eat();
ladyLazy.play();
ladyLazy.run();
ladyLazy.sleep();
ladyLazy.sleepAllTheDay();
}
}
在实际开发中,经常会遇到面向对象的一些问题,比如「多重继承」,还原案发线程,整个过程大概是这样:
接口 A 和接口 B 拥有相同的方法;
接口 B 继承接口 A,C 是独立接口;
类 D 有和 A、B 相同的方法。
第一种情况:类 E 同时实现接口 A 和接口 B 时,会调用哪个接口的方法?
答:根据就近原则,会调用 接口 B 的方法。
package com.xxm.Task4;
/*
接口 A 和接口 B 拥有相同的方法;
接口 B 继承接口 A,C 是独立接口;
类 D 有和 A、B 相同的方法。
*/
public class Task4_3_1 {
interface A {
default void run() {
System.out.println("hello from A");
}
}
interface B extends A {
default void run() {
System.out.println("hello from B");
};
}
interface C {
void fly();
}
class D {
void run() {
System.out.println("D:run");
}
}
static class E implements A, B {
}
public static void main(String[] args) {
E e = new E();
e.run();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjF1N12H-1634828901571)(https://img-community.csdnimg.cn/images/3140fb06b5244950a90ca79ebb057b0c.png “=600 #left”)]
第二种情况:类 E 继承 D,同时实现接口 A 和接口 B 时,会调用哪个方法?
答:调用的是类 D 的方法。
package com.xxm.Task4;
/*
接口 A 和接口 B 拥有相同的方法;
接口 B 继承接口 A,C 是独立接口;
类 D 有和 A、B 相同的方法。
*/
public class Task4_3_1 {
public interface A {
default void run() {
System.out.println("hello from A");
}
}
public interface B extends A {
default void run() {
System.out.println("hello from B");
};
}
interface C {
void fly();
}
static class D {
public void run() {
System.out.println("D:run");
}
}
static class E extends D implements A, B {
}
public static void main(String[] args) {
E e = new E();
e.run();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSO1pxOr-1634828901574)(https://img-community.csdnimg.cn/images/19572227486a4d36a67ff1b01da57250.png “=600 #left”)]
第三种情况:类 E 同时实现接口 A、接口 B 和接口 C 时,会调用哪个方法?
答:这种情况需要手动指定继承哪一个类,代码指定的接口 C。
package com.xxm.Task4;
/*
接口 A 、接口 B 、接口 C 拥有相同的方法;
接口 B 继承接口 A,C 是独立接口;
类 D 有和 A、B 相同的方法。
*/
public class Task4_3_1 {
interface A {
default void run() {
System.out.println("hello from A");
}
}
interface B extends A {
default void run() {
System.out.println("hello from B");
}
;
}
interface C {
default void run() {
System.out.println("Hello from C");
}
;
}
class D {
void run() {
System.out.println("Hello from D");
}
}
static class E implements A,B,C{
@Override
public void run() {
C.super.run();
}
}
public static void main(String[] args) {
E e = new E();
e.run();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa1BRBb9-1634828901576)(https://img-community.csdnimg.cn/images/30eec6db10f445babd95ffd3c9ec31c7.png “=600 #left”)]
第四种情况:类 E 继承 D,且同时实现接口 A、接口 B 和接口 C 时,会调用哪个方法?
答:会调用类 D。
package com.xxm.Task4;
/*
接口 A 和接口 B 拥有相同的方法;
接口 B 继承接口 A,C 是独立接口;
类 D 有和 A、B 相同的方法。
*/
public class Task4_3_1 {
interface A {
default void run() {
System.out.println("hello from A");
}
}
interface B extends A {
default void run() {
System.out.println("hello from B");
}
;
}
interface C {
default void run() {
System.out.println("Hello from C");
}
;
}
static class D {
public void run() {
System.out.println("Hello from D");
}
}
static class E extends D implements A, B, C {
}
public static void main(String[] args) {
E e = new E();
e.run();
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjVhnE9S-1634828901579)(https://img-community.csdnimg.cn/images/7c1c469ac9f846fba67cc7ec143c0456.png “=600 #left”)]
package zh.codegym.task.task07.task0702;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
以相反顺序显示字符串数组
*/
public class Solution {
public static void main(String[] args) throws Exception {
String[] arr = new String[10];
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 8 ; i++) {
String s = reader.readLine();
arr[i] = s;
}
for (int i = 9; i >=0 ; i--) {
System.out.println(arr[i]);
}
//在此编写你的代码
}
}
显示数字数组的内容,每行显示一个值。
package zh.codegym.task.task07.task0703;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
寂寞数组之间的互动
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int[] intArr = new int[10];
String[] stringArr = new String[10];
for (int i = 0; i < stringArr.length; i++) {
String s = reader.readLine();
stringArr[i] = s;
}
for (int i = 0; i < stringArr.length; i++) {
intArr[i] = stringArr[i].length();
}
for (int x : intArr
) {
System.out.println(x);
}
//在此编写你的代码
}
}
package zh.codegym.task.task07.task0705;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
一个大数组和两个小数组
*/
public class Solution {
public static void main(String[] args) throws Exception {
int[] bigArr = new int[20];
int[] smallArr1 = new int[10];
int[] smallArr2 = new int[10];
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < bigArr.length; i++) {
int n = Integer.parseInt(reader.readLine());
bigArr[i] = n;
}
for (int i = 0; i < smallArr1.length; i++) {
smallArr1[i] = bigArr[i];
}
for (int i = 0; i < smallArr2.length; i++) {
smallArr2[i] = bigArr[i + 10];
}
for (int x : smallArr2
) {
System.out.println(x);
}
}
}
注意:
索引为 0 处的房屋门牌号视为偶数。
5.如果街道每侧的居民数量相同,则不输出任何内容。
package zh.codegym.task.task07.task0706;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
街道和房屋
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int[] arr = new int[15];
for (int i = 0; i < arr.length; i++) {
int num = Integer.parseInt(reader.readLine());
arr[i] = num;
}
int oddSum = 0; //奇数门牌号总人数
int evenSum = 0; //偶数门牌号总人数
//求总人数
for (int i = 0; i < arr.length; i++) {
if (i % 2 == 1) {
oddSum += arr[i];
}else{
evenSum += arr[i];
}
}
//比较
if(oddSum > evenSum){
System.out.println("居住在门牌号为奇数的房屋的居民更多。");
}else if(oddSum < evenSum){
System.out.println("居住在门牌号为偶数的房屋的居民更多。");
}
}
}
1.创建字符串列表。
2.向列表中添加 5 个不同的字符串。
3.在屏幕上显示列表大小。
4.使用循环显示列表内容,每行显示一个值。
注意:
仅在初始化列表后,再将字符串添加到列表中。
package zh.codegym.task.task07.task0707;
import java.util.ArrayList;
/*
那是什么类型的列表?
*/
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<String>(5);
list.add("塔玛希");
list.add("miao");
list.add("喵");
list.add("HarpyLady");
list.add("青眼白龙");
System.out.println(list.size());
for (String s : list
) {
System.out.println(s);
}
}
}
1.初始化字符串列表。
2.从键盘读取 5 个字符串,并将其添加到此列e表中。
3.使用循环找出列表中最长的字符串。
4.显示字符串。如果有多个最长字符串,则每行显示一个。
Requirements:
package zh.codegym.task.task07.task0708;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/*
最长的字符串
*/
public class Solution {
private static List<String> strings;
public static void main(String[] args) throws Exception {
strings = new ArrayList<String>(5);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int maxLenth = 0;
ArrayList<String> longestStrings = new ArrayList<String>(5);
//录入5个字符串,记录最大长度
for (int i = 0; i < 5; i++) {
String s = reader.readLine();
if (s.length() > maxLenth) {
maxLenth = s.length();
}
strings.add(s);
}
//遍历打印最长字符串
for (String s : strings
) {
if (s.length() == maxLenth) {
System.out.println(s);
}
}
}
}
1.创建字符串列表。
2.从键盘读取 5 个字符串并将其添加到列表中。
3.使用循环找出列表中最短的字符串。
4.显示字符串。
5.如果有多个最短字符串,则每行显示一个。
Requirements:
1. 声明字符串列表变量并立即初始化该变量。
2. 程序应从键盘读取 5 个字符串并将其写入列表中。
3. 程序应显示最短的字符串。
4. 如果有多个最短字符串,则需要每行显示一个。
package zh.codegym.task.task07.task0709;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
更简洁地表达自己
*/
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<String>(5);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//录入字符串
for (int i = 0; i < 5; i++) {
String s = reader.readLine();
list.add(s);
}
//获取最短字符串长度
int shortestLength = list.get(0).length();
for (String s : list) {
if (s.length() < shortestLength) {
shortestLength = s.length();
}
}
//遍历打印最短字符串
for (String s : list) {
if (s.length() == shortestLength) {
System.out.println(s);
}
}
}
}
1.在 main 方法中创建字符串列表。
2.从键盘向该列表中添加 10 个字符串,但只将其添加到列表开头而非末尾。
3.使用循环显示内容,每行显示一个值。
Requirements:
1. 声明字符串列表变量并立即初始化该变量。
2. 程序应从键盘读取 10 个字符串并将其添加到列表中。
3. 程序应向列表开头添加几行内容。
4. 程序应显示列表,每行显示一个值。
package zh.codegym.task.task07.task0710;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
到达列表顶部
*/
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>(10);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//添加内字符串至列表开头
for (int i = 0; i < 10; i++) {
list.add(0, reader.readLine());
}
//遍历打印
for (String s : list) {
System.out.println(s);
}
}
}
1.创建字符串列表。
2.从键盘添加 5 个字符串。
3.将以下操作执行 13 次:删除最后一个字符串,并将其插入开头位置。
4.使用循环显示生成的列表,每行显示一个值。
Requirements:
package zh.codegym.task.task07.task0711;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
删除和插入
*/
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>(5);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 5; i++) {
list.add(reader.readLine());
}
for (int i = 0; i < 13; i++) {
String s = list.get(4);
list.remove(4);
list.add(0, s);
}
for (String s : list) {
System.out.println(s);
}
}
}
1.创建字符串列表。
2.从键盘添加 10 个字符串。
3.找出列表中较早出现的字符串:最短的或最长的。
如果有多个字符串为最短或最长的字符串,则考虑遇到的第一个此类字符串。
4.显示第 3 步中描述的字符串。应显示一个字符串。
Requirements:
package zh.codegym.task.task07.task0712;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
最短或最长
*/
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
String s = reader.readLine();
list.add(s);
}
String minSizeElement = list.get(0);
int posMinElement = 0;
String maxSizeElement = list.get(0);
int posMaxElement = 0;
for (int i = 0; i < 10; i++) {
if (list.get(i).length() < minSizeElement.length()) {
minSizeElement = list.get(i);
posMinElement = i;
} else if (list.get(i).length() > maxSizeElement.length()) {
maxSizeElement = list.get(i);
posMaxElement = i;
}
}
if (posMinElement < posMaxElement) {
System.out.println(minSizeElement);
} else if (posMaxElement < posMinElement) {
System.out.println(maxSizeElement);
}
}
}