typora-root-url: 学习笔记img
Java三大特性
1.封装
概念:封装的概念就是把类的属性私有化,不能通过类名.的方式直接访问,但可以通过类中的公开方法get、set方法进行私有属性的调用
封装是怎么实现的呢?
- 需要修改属性的访问控制符(修改为private);
创建getter/setter方法(用于属性的读写);
在getter/setter方法中加入属性控制语句(用于判断属性值的合法性);
2.继承
继承的意思就是Animal(父类),一个大的笼统的类,其中包含了多个子类如:Dog、Pig、Bird…
这些子类都继承了父类Animal的属性和方法。
**注意:**Java中继承只能继承一个父类,但可以多级继承。如儿子(子类)继承了爸爸(父类),而爸爸又继承了爷爷(爸爸的父类),通过这种方式,儿子也有了爷的方法,但是儿子是不能继承父亲又继承爷爷的。
代码图实例如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwx9UKo5-1616146828558)(学习笔记img/继承)]
从此处可见,子类并初始化定义方法,但是继承了来自父类的方法。所以把子类实例化之后,可以通过.的方式调用method(),最后结果显而易见了。
**注意:**父类的私有属性及构造方法是不能被子类继承的,但可以通过get/set方法对其进行访问调用
方法
访问修饰符:
方法重写与方法重载:
方法重写原则:
- 方法名称、参数列表与父类相同。
- 返回值类型必须与父类相同或其子类
- 访问修饰符可与父类相同或是比父类更宽泛。
方法重写的执行:
子类重写父类方法后,调用时优先执行子类重写后的方法。
方法重写的特性:
Ø 子类重写父类方法时子类方法会覆盖父类方法。
Ø 子类重写父类方法,访问级别不能严于父类方法。
Ø 子类重写方法名和类型与父类一样。
父类的构造方法无法重写,只能被覆盖。
public class Demo2 {
}
class Son extends Father {
int i=3;
public void hello() {}
public void hello(int i) { //重载了初始的hello,方法名相同,参数列表不同。跟public void 这两东西没关系
System.out.println("儿子直接被爸爸奖励了"+i+"个大嘴巴子");
}
}
class Father extends GrandFather {
@Override
public void hello() { // 访问值类型相同,访问修饰符比子类更广,返回值若为Animal这种,则可以是其子类Dog、Cat啊这种
System.out.println("父亲招呼我最爱的大嘴巴子");
}
}
class GrandFather {
public void hello() {
System.out.println("爷直接打招呼");
}
}
3.多态
多态的概念就是通过父类对象指向子类的实例。其中只能调用父类中有的方法,子类重写了优先调用子类
package Note1;
//测试多态
public class DuoTai {
public static void main(String[] args) {
Animal an=new Dog();//此处表示把狗当动物来看了
an.method();
}
}
class Animal{
public void method() {
System.out.println("动物");
}
}
class Dog extends Animal{
public void method() {
System.out.println("狗");
}
}
//此处输出的为狗
三个关键字abstract/static/final
abstract:
abstract:抽象,如其名字,是个模糊的概念。在java中这个关键字表示为脑海里有这个概念,但实际上并不存在的东西,如动物、生活用品。。
因此我们在创建对象的时候,这种不存在的对象是不应当被创建出来的
***abstract:一个不该被创建出来的东西,也无法实例化***
**他可以被子类所继承,是一个依托于子类的东西**
package Note1;
public class Abstract {
public static void main(String[] args) {
Animal1 an=new Dog1();
an.eat();
an.run();
}
}
abstract class Animal1{
public abstract void eat();
public abstract void run();
/*
* 根据之前所学的,这里的eat和run方法是动物在跑,但实际上动物并不是一个具体实例
* 因此他的方法也是抽象的,若子类猫啊狗啊什么的实现则需要重写
*/
}
class Dog1 extends Animal1{
@Override
public void eat() {
// 重写Animal的eat方法
System.out.println("狗吃骨头");
}
@Override
public void run() {
// 重写Animal的run方法
System.out.println("狗子迈腿开跑");
}
}
static
概念:
- 静态(static)可以修饰属性和方法。
- 称为静态属性(类属性)、静态方法(类方法)。
- 静态成员是全类所有对象共享的成员。
- 在全类中只有一份,不因创建多个对象而产生多份。
- 不必创建对象,可直接通过类名访问。
静态的特点
- 静态方法允许直接访问静态成员。
- 静态方法不能直接访问非静态成员。
- 静态方法中不允许使用this或是super关键字。
- 静态方法可以继承,不能重写、没有多态。
类加载
JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件。
- 将.class文件中对类的描述信息加载到内存中,进行保存。
- 如:包名、类名、父类、属性、方法、构造方法…
- 加载时机:
- 创建对象。
- 创建子类对象。
- 访问静态属性。
- 调用静态方法。
- 主动加载:Class.forName(“全限定名”);
final
-
final修饰类:此类不能被继承。
-
String、Math、System均为final修饰的类,不能被继承。
-
final修饰方法:此方法不能被覆盖。
-
意为最终方法,不支持子类以覆盖的形式修改。