Java由浅入深,基础到进阶(持续更新中)

some java questions

ideal中的快捷键

1.alt+Insert选中成员变量然后可以自动创建带参或者无参构造(选中类名)。
2.当子类继承父类创建构造方法时,直接选择参数点击确定后,无参构造方法也会被创建。
3.子类重写父类方法时,输入需要重写的方法然后按Enter键即可。
4.API中找方法,首先ctrl+B进入类;然后alt+7打开方法列表,并将列表放在右侧。

1.关于构造方法

作用:明确方法的属性,例如姓名,年龄等

schoolDemo2:
Demo:

package schoolDemo2;

/*
    测试类
*/
public class Demo {
   
    public static void main(String[] args) {
   
        //无参构造可以运行不报错是因为如果自己不写无参构造的话,系统自动生成一个无参构造
        //创建老师类对象进行测试
        var t1 = new Teacher();
        t1.setName("林青霞");
        t1.setAge(16);
        System.out.println(t1.getName() + "," + t1.getAge());
        t1.teach();
        System.out.println("-------------------");
//直接创建带参的对象报错是因为,student中没有创建带参构造,系统也不会自动生成带参构造,所以必须自己创建带参的构造.如果自己创建了带参构造,那么系统将不会自动创建无参构造,所以,当创建带参构造的时候,必须一块创建一个无参构造。
        var s1 = new Student("风清扬", 16);
        System.out.println(s1.getName() + "," + s1.getAge());
        s1.Study();

    }
}

package schoolDemo2;

public class Person {
   
    private String name;
    private int age;

    public Person() {
   

    }

    public Person(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getAge() {
   
        return age;
    }

    public void setAge(int age) {
   
        this.age = age;
    }
}

package schoolDemo2;

public class Student extends Person {
   
    public Student() {
   
    }

    public Student(String name, int age) {
   
        super(name, age);
    }

    public void Study() {
   
        System.out.println("好好学习天天向上");
    }
}

package schoolDemo2;

public class Teacher extends Person{
   
    public void teach(){
   
        System.out.println("用爱成就每一位学员");
    }
}

研究

class Array {
   

    /**
     * Constructor.  Class Array is not instantiable.
     */
    private Array() {
   }

例如Array这个类,如果没有创建构造方法,系统将会自动给出一个无参构造方法,然后用户就可以利用这个无参构造方法来创建对象(用new创建对象),为了防止被创建对象,作者给出了一个private修饰的无参构造方法,这样就不能直接访问和创建对象。但是Array类里面的方法都用static修饰,想要使用Array这个类的方法,需要类名调用方法。这就是Array这个类的设计思路。

2.成员变量和局部变量

var的用法:

var可以用于局部变量中,但是不能用在成员变量中。在不影响程序可读性的情况下推荐用var.

3.包(package)其实就是文件夹

作用:对类进行分类管理

用法:import导包,不然就得像文件夹地址一样输入

4.权限修饰符

修饰符 同一个类中 同一个包中子类无关类 不同包的子类 不同包的无关类
private ok false false false
默认(void) ok ok false false
protected ok ok ok false
public ok ok ok ok

final

final修饰基本类型:

final int age = 20;
age就变成了一个常量,不能再被赋值.即数据值不能再改变。

final修饰引用类型变量:

final Student s = new Student();
s.age = 100;
输出结果s.age = 100.
其中s的地址值不会再改变,地址值指向的内容,例如age可以变化,但是地址不会改变。
引用类型的地址值不能再改变。

static:

被类的所有对象共享:这也是我们判断是否使用静态关键字的条件。
被static修饰的变量一旦被赋值,则会被所有对象共享,通过随便一个对象赋值一次就好了。
可以通过类名调用(推荐)

static访问特点:静态的成员方法,只能访问静态的成员。非静态的成员方法可以访问非静态和静态的成员。

5.多态

概念:由父类引用指向子类对象。

public class Cat extends Animal{
   
	Animal ani = new Cat();
}

特点:

1.多态的形式访问变量,编译和运行都要看左边,Aniaml有的变量才能运行,并且运行结果是Animal的变量值。
2.多态的形式访问成员方法,编译看左边,运行看右边,Aniaml有的成员方法才能运行,并且运行结果是Cat的成员方法(如果子类重写了父类的方法,则多态输出的方法是子类重写之后的数据)。
3.为什么成员变量和成员方法的访问不一样呢?因为成员方法有重写,而成员变量没有。
4.其实多态里面只需要声明一个类型是父类的变量即可,例如:

Animal a;
a = new Cat("XiaoMiao",1);
....
a = new Dog();
a.eat();

6.抽象

概念:如果一个方法没有方法体,则这个方法是个抽象方法,用abstract定义,并且抽象方法应该在抽象类里面。

例如:public abstract void eat();

意义和用法:用abstract修饰

1.比如说,有Animal类,Cat类,Dog类。Cat类和Dog类都继承Animal类,Animal类中有一个eat()方法,但是猫狗吃的东西是不一样的,所以这个eat()方法应该是空的,也就是抽象方法。
2.抽象类不是具体的,所以不能直接实例化对象。但是可以参照多态的形式实例化对象。例如:Animal a = new Cat();因为Cat类中的方法重写了Animal类的抽象方法。所以,子类必须重写父类中的所有抽象方法。如果不重写父类抽象类的抽象方法,那么子类也必须是一个抽象类,但是如果想要实例化子类对象,也必须重写子类中的抽象方法。
3.抽象类中不一定有抽象方法,但是有抽象方法一定有抽象类。

package chouXiang_11;

public abstract class Animal {
   
    public abstract void eat();
    public void sleep(){
   
        System.out.println("睡觉");
    }
}

package chouXiang_11;

public class AnimalDemo {
   
    public static void main(String[] args) {
   
        Animal a = new Cat();
        a.eat();
        a.sleep();
    }
}

package chouXiang_11;

public class Cat extends Animal {
   
    @Override
    public void eat() {
   
        System.out.println("猫吃鱼");
    }
}

package chouXiang_11;

public abstract class Dog extends Animal{
   
}

抽象类的成员特点

1.父类的抽象方法存在的意义在于:限定子类必须重写某种方法(因为父类的抽象方法是一个没有方法体的方法)。

7.java接口

概念

接口就是一种公共的规范标准,只要符合规范,大家都可以通用。java中的接口更多的体现在对行为的抽象。

接口的特点

1.关键字interface:
public interface 接口名{}
2.类实现接口用implements表示:
public class 类名 implements 接口名 {}
3.接口不能直接实例化:
想要实例化的话,参照抽象类多态的方式,这叫接口多态。

接口的成员特点

1.成员变量:
只能是常量
默认修饰符:public static final
2.构造方法:
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在
一个类如果没有父类,默认继承自Object类
3.成员方法:
只能是抽象方法
默认修饰符:public abstract

8.接口多态和抽象多态

接口多态只能调用接口的方法,抽象多态只能调用抽象的方法。但是这需要创建两个对象,所以实际写代码的时候不会创建两个对象,而是创建一个子类对象,因为子类对象重写了所有的方法,是最全的,用子类对象来调用所有的方法。

9.抽象类和接口的区别

成员区别:
抽象类:变量,常量,有构造方法,有抽象方法,也有非抽象方法。
借口:常量,抽象方法
关系区别:
类与类:继承,单继承
类与接口:实现,可以单实现,也可以多实现
接口与接口:继承,单继承,多继承
设计理念区别:
抽象类:对类抽象,包括属性,行为
借口:对行为抽象,主要是行为
抽象类是对事物的抽象,接口是对行为的抽象。

10.内部类和外部类

访问特点:内部类可以访问外部类的成员(成员变量和成员方法),包括私有。外部类要访问内部类的成员,必须先创建对象。

成员内部类

外界如何访问成员内部类(public修饰的,不过意义不大,因为既然当做内部类,就不想被访问到,所以需要用private修饰)?
格式:外部类名.内部类名 对象名 = 外部对象.内部对象;
范例:Outer.Inner oi = new Outer().new Inner();

局部内部类

11.匿名内部类

前提:
存在一个类或者接口,这里的类可以是具体的,也可以是抽象的。
格式:
new 类名或者接口名(){
重写方法;
}
本质是什么呢?
是一个继承了该类或者实现了该接口的子类匿名对象
范例:

public class Outer{
   
	public void method(){
   
		Inner i = new Inner(){
   
			@override
			public void show(){
   
				System.out.println("匿名内部类");
			}
		}.show();   //因为这是个对象,而对象可以调方法
	}
}

意义

当有很多类似的事物,比如说,猫可以跳高了,狗可以跳高了,猪可以跳高了等,这些类只用一次,所以没必要创建这么多类似的类,就是用匿名内部类来做。

12.自动装箱和自动拆箱

装箱:基本数据类型转化为对应的包装类型,例如
int - Integer
拆箱:包装类型转化为相应的基本类型,例如
Integer - int
自动装箱:Integer i = 100;
其中底层自动完成步骤为:Integer i = Integer.valueOf(100);

13.空指针异常

null本身就是空,空调用方法肯定是空指针异常,所以调用方法时,首先需要判断是不是空指针。
例如:

Integer iii = null;
iii += 300;//NullPointerException

改为:

Integer iii = null;
	if(iii 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值