JAVA笔试基础复习(二)

1. 方法

方法参数传递,引用数据类型(传的地址):

package com.itheima.demo1;
import java.util.Scanner;
public class demo2 {

    public static void main(String[] args) {
        int cd = add(1,2);
        eat();
        isEcenNumber(1); // 这里的1是实参
        int number = 10;
        isEcenNumber(number); // 这里的number也是实参
     }
     public static void eat(){
        study();
         System.out.println("吃饭");
     }
     public static void study(){
         System.out.println("学习");
     }
     public static void isEcenNumber(int num){ //这里的num是形式参数
        if(num%2 == 0){
            System.out.println("偶数");
        }else{
            System.out.println("奇数");
        }
     }
     // 方法重载, 同名,参数不同,和返回名无关
    public static int sum(int a, int b){
        return a + b;
    }
    public static int sum(int a, int b, int c){
        return a + b + c;
    }

     public static int add(int a, int b){
        int c = a + b;
        return c;
     }

     
}

2. 二维数据

package com.itheima.demo1;
import java.util.Scanner;
public class demo2 {

    public static void main(String[] args) {
        int[] arr1 = {11, 22, 33};
        int[] arr2 = {44, 55, 66};
        int[] arr3 = {77, 88, 99, 100};

        int[][] arr = new int[3][3];

        arr[0] = arr1;
        arr[1] = arr2;
        arr[2] = arr3;

        System.out.println(arr[1][2]);
        System.out.println(arr[2][3]);

        // 静态初始化
        int[][] arr4 = {{11,22,33}, {44,55,66}};
        int[][] arr5 = {arr1, arr2};
    }
}

3. 封装

package com.itheima.demo2;

/*
private :可以用来修饰成员(变量/方法)
特点:只能在本类中进行方法,外界无法用.访问变量
为什么要用private?
因为我在外界用stu.age写入时,可能会写错,stu.age=-20。
如果我用set方法,里面写判断正误的语句,就不会出现上面的问题。
 */
/*
this的作用:局部变量和成员变量重名时,this可以把局部变量标识为成员变量
this可以调用本类的成员(变量/方法),局部变量和成员变量重名
 */

/*
构造方法:如果没有定义构造方法,系统会给出默认的无参构造方法
如果自己定义了构造方法,例如public Student(int age){},
系统就不提供无参构造方法了。Student stu = new Student();就会报错。必须自己再写一个无参的

构造方法的作用:用来给对象初始化的。
 */
public class Student {
    String name;
    private int age;

    public Student(){
        System.out.println("这是我自己定义的无参构造方法");
    }
    public Student(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("这是我自己定义的有参构造方法");
    }

    public void setName(String name){
      //  name = name; // 为啥要有this,因为没有的this,这里的name都是局部变量。
        this.name = name;
    }

    public void set(int a){
        if(a >=0 && a<=120) {
            age = a;
        }else{
            System.out.println("您的年龄不符合要求");
        }

    }
    public int get(){
        return age;
    }
    public void show(){
        System.out.println(name + "..." + age);
    }
}
package com.itheima.demo2;

public class TestStudent {
    public static void main(String[] args) {
        Student stu = new Student("张三",23);
        stu.name = "张三";
        //stu.age = 23;
        stu.set(23);
        stu.show();
    }
}

IDEA有快捷键:

代码空白处右键Generate:

4. Static关键字:共享,推荐类名调用,优先于对象存在

静态方法的特定:

 静态随着类的加载而加载,优先于对象存在既可以用实例来调用,也可以用类名来调用

非静态需要在创建对象之后,才可以进行使用

1. 静态的方法只能访问静态成员

static String school;

public static coid method(){

school =  "12"; // 但是使用this.school就会报错

}

2. 非静态方法中,可以使用静态成员,也可以使用非静态成员。

3. 静态方法中,没有this关键字。(this是创建对象后,才能存在。静态存在的时候,对象可能都没创建)

----------------------------

5. 关于继承的构造方法:子类的有参构造和无参构造都会默认先进行父类的无参构造方法(这叫初始化)super()是系统默认加的,就算不写,系统也会加上。。除非手动初始化,例如下面在子类的有参构造里初始化父类的有参构造,这样就不会初始化父类的无参构造了-----------super(myName, myId)

其实我们写的每一个类都继承Object方法。。。

package com.itheima.demo3;

public class Animal {
    public String pub;
    private String name;
    private int id;
    public Animal(){
        System.out.println("无参构造");
    }
    public Animal(String myName, int myid) {
        name = myName;
        id = myid;
        System.out.println("有参构造");
    }
    public void eat(){
        System.out.println(name+"正在吃");
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() {
        System.out.println("大家好!我是"         + id + "号" + name + ".");
    }
}
package com.itheima.demo3;

public class Mouse extends Animal {
    String pub = super.pub;
    public Mouse(){
        // 其实是默认省略super(); 使用无参构造一定会先父类
        System.out.println("w1");
    }
    public Mouse(String myName, int myid) {
        super(myName, myid);
        super.eat();
    }

    public static void main(String[] args) {
        Mouse ms = new Mouse("ms", 1); // 有参构造默认初始化父类的无参构造,但是我这里手动初始化父类的有参构造了。
        Mouse ms2 = new Mouse(); // 无参构造默认初始化父类的无参构造,

    }
}

 

5. 继承的特点

父类引用指向子类对象-----这是多态后面会说。就是Animal ms = new Mouse();

就近原则(子父类当中,出现了重名的成员变量)

package com.itheima.dem4;

public class Fu {
    int a = 10; // 没有私有化,子类是可以直接用的
}

package com.itheima.dem4;

public class Zi extends Fu{
    int a = 20;
    public void method(){
        int a = 30;
        System.out.println(a); // 会先找局部变量,没有的话再找成员变量,再没有去父类找

        // 需求1:在控制台打印本类成员变量 20
        System.out.println(this.a);

        //需求2:在控制台打印父类成员变量 10
        System.out.println(super.a);
    }
}

package com.itheima.dem4;

public class Test {

    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();
    }
}

super代表父类对象引用,this代表本类对象引用。

方法调用:先在子类里找,子类没有才在父类里找。

方法重写:子类里面有和父类一摸一样的方法声明;在IEAD只需要输入方法名,输个回车,就出来了,默认多个super.show(),可以删掉重写了。@Override是自动检查当前方法是不是一个正确的重写方法。

@Override
public void show() {
    super.show();
}

 方法重写的注意事项:父类中私有方法不能被重写,父类静态方法,子类必须通过静态方法进行重写(会发现@Override报错,因为静态方法不能被重写,只是现象上是重写),非静态非静态方法重写。子类重写方法,访问权限必须大于等于父类。

 6. 抽象类

当一个父类的方法逻辑描述不清,可以用抽象表现。

抽象方法:当共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出

具体明确,该方法就可以定义为抽象方法;

抽象类:如果一个类中存在抽象方法,那么该类必须声明为抽象类。

package com.itheima.demo4;

public abstract class Animal {
    public void drink(){
        System.out.println("喝水");
    }
    public abstract void eat(); // 不知道写啥,不写。前边加个abstract,然后子类必须重写
}
-----------------------------------------------------------------
package com.itheima.demo4;

public class Dog extends Animal{

    @Override
    public void eat() {
        System.out.println("狗吃肉");

    }
}
-------------------------------------------------------------------
package com.itheima.demo4;

public class Cat extends Animal{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
-----------------------------------------------------------------
package com.itheima.demo4;

public class Test1Animal {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.eat();
        d.drink();

        Cat c = new Cat();
        c.eat();
        c.drink();

     // 1. 抽象类无法创建对象   Animal a = new Animal(); X
        // 抽象类中有构造方法(当然有,不然怎么子类构造方法初始化)
        // 抽象类的子类 A:必须重写父类所有的抽象方法
                   // B:可以把自己也变成一个抽象类 (意义不大,知道就可以)
        // 抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类

    }
}

7. final方法

(1). 有时候子类莫名其妙的重写父类的方法,但是父类不希望这个方法被重写,那么我就用final定义。(最终方法,不被重写

public final void write(){}

(2) final修饰变量,表明该变量是常量,不能被再次赋值

final int A = 10;只能被赋值一次。

(一般的命名规则。一个单词大写,多个单词,下划线连接并大写)

final int MAX=10;  final int MAX_VALUE=20

 

(3)修饰类,不能被继承。 final class Fu{}

8. 接口:抽象类的进阶

抽象方法都需要在子类中被重写的,不然类会报错的。

当一个类中所有方法都是抽象方法的时候,我们就可以将其定义为接口。

接口也是一种引用数据类型,它比抽象类还要抽象。

接口:规则,程序的扩展性

 

 

 接口的改进:

 实现类中的方法不需要加default了。

 

9. 多态

多态的三个前提条件:(必需)

 所以记起来就是,只看成员变量结果看父类,只看成员方法的结果看子类。

那么为什么要用多态?好处和弊端

 

 如果我就想调用子类特有的方法呢?

可以向下转型:从父类的类型再转换成子类的类型(强制转换)

Fu f = new Zi();

Zi z = (Zi) f;

z.method();

向上转型,反过来。

但是会有风险:

 先用instancaof关键字判断是不是属于这个类型的

10. 接口中的静态方法

 

 11. 接口中的私有方法

口中不存在继承的概念,都是重写方法

关于在接口中定义非抽象方法

(1).  可以定义为静态方法,但是不存在重写一说。

(2 ). 可以使用default关键字。

(3).  JDK9中可以使用private关键字定义为私有方法。

 

关于静态方法在接口和继承的比较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值