一、权限修饰符
访问修饰符是Java中用来控制类、属性和方法的可见性和访问权限的关键字。访问修饰符有四种:public、protected、default(无修饰符)和private。它们分别表示了不同的访问范围:
public:表示公开的,可以被任何类访问。
protected:表示受保护的,可以被同一个包中的类或者不同包中的子类访问。
default:表示默认的,可以被同一个包中的类访问。
private:表示私有的,只能被本类访问。
我们可以通过以下表来说明访问权限:
二、关键字
2.1 this关键字
this关键字(当前对象),可以用来修饰属性,方法,构造器(构造方法)
2.1.1 this 修饰属性和方法
this理解为当前对象或当前正在创建的对象;
在类的方法中,可以使用“this.属性”或“this.方法”调用正在创建的对象的属性和方法,但通常都选择省略“this ."
特殊的:当属性与构造器或方法形参同名时,用
"this ."来表明是属性;
2.1.2this调用构造器(重复的操作)
格式 this(形参列表)调用本类中指定的其他构造器;
构造器中不能通过”this(形参列表)"调用自己;
若一个类中有n个构造器,则最多有n-1个构造器使用了(this(形参列表))来调用本类中的其他构造器;
规定:"this (形参列表)必须声明在当前构造器首行;
构造器内部最多只能声明一个"this(形参列表)"来调用其他构造器。
2.1.3代码演示:
class Person
{
private String name;
private int age;
Person(String name, int age)
{
this.name = name;
this.age = age;
}
public boolean compare(Person p)
{
return this.age == p.age;
}
}
class PersonThis
{
public static void main(String[] args)
{
Person p1 = new Person("zhagnsan",24);
}
}
2.2super关键字
super关键字(父类的),用来调用属性,方法,构造器
2.2.1super的使用
可以在子类的方法或构造器中通过super.属性或super .方法的方式显式调用父类中声明的属性或方法;通常习惯省略super;
特别的:当子类和父类定义了同名的属性时,要想在子类中调用父类的属性,则必须使用super;
特别的:当子类重写了父类中的方法后,我们想调用父类中被重写的方法时,则必须显式的使用super.方法来调用父类中的方法;
2.2.2super调用构造器
可以在子类构造器中显式的使用“super(形参列表)的方式调用父类中声明的指定的构造器;
super(形参列表)的使用必须声明在子类构造器的首行;
在类的多个构造器中,至少有一个类的构造器使用了super(形参列表),调用父类的构造器;
说明:为什么super(形参列表)或this(形参列表)调用语句只能作为构造器中的第一句?
无论通过哪个构造器,创建子类对象,需要保证先初始化父类目的:当子类继承父类后,继承 父类中所有的属性和方法,因此子类有必要知道父类如何为对象进行初始化;
2.2.3代码演示:
class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(this.name + " " + this.age);
}
}
class Dog extends Animal {
private String color;
public Dog() {}
public Dog(String n, int a, String c) {
super(n, a); // 调用父类的构造方法
color = c;
}
public void show() {
System.out.println(color);
super.show();
}
}
public class AnimalDemo {
public static void main(String[] args) {
Dog d = new Dog("沙皮狗", 2, "黄色");
d.show();
}
}
2.3 final 关键字
final(最终的) ,可以修饰类、方法、变量
inal用来修饰一个类,则此类不可以被其他类所继承(比如:String类、System类、StringBuffer类);
final用来修饰方法,表明此方法不能被重写;
final 用来修饰“变量” 此时的变量就称为是一个常量;
final来修饰属性:可以考虑的赋值位置 ,显式初始化、代码块中赋值、构造器中赋值(多个构造器问题,每个都要进行赋值)
final修饰局部变量(形参):表明此形参是一个常量,当我们调用此方法时,给常量形参赋一个实参,一旦赋值后,只能使用不能再次修改;
2.4 static 关键字
static(静态的)可以修饰属性、方法、代码块、内部类(主要修饰类的内部结构)
2.4.1使用static来修饰属性:变量(类变量)
分类:静态变量Vs 非静态变量(实例变量)
实例变量:当创建类的多个对象时,每个对象都独立的拥有一套类中的非静态属性;当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的修改;
静态变量:创建多个对象时,多个对象共享同一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量是修改过了的;
2.4.2static修饰方法(静态方法)
随着类的加载而加载,可以通过“ 类. 静态方法”调用;
静态方法中只能调用静态的方法和属性;(生命周期不同)
非静态的方法,既可以调用静态的方法和属性也可以调用非静态的方法和属性;
在静态的方法内,不能使用this 、super 关键字;
2.5 abstract关键字
abstract(抽象的)可以用来修饰类、方法
2.5.1 abstract来修饰类(抽象类)
此类不能实例化;
抽象类中一定有构造器,便于子类对象实例化时调用;
开发中,都会提供抽象类的子类让子类对象实例化,完成相关操作;
2.5.2 abstract修饰方法(抽象方法)
抽象方法只有方法的声明没有方法体;
包含抽象方法的类一定是抽象类;反之抽象类中可以没有抽象方法
若子类没有重写了父类中所有的抽象方法,则此类也是一个抽象类,需要abstract来修饰;
三、继承(extends)
3.1为什么需要继承:
在有写时候类和类之间有相同的属性和方法,继承可以一个子类继承另一个父类的属性和方法,并且可以在子类中添加新的属性和方法或者重写父类的方法,如果没有继承,这些属性和方法每个类都要写,是一件重复而且繁琐的事;
3.2继承的好处以及特点
好处: 少写一些共有的代码;提供另外一种形式的分类;代码重用
特点:子类可以继承父类的属性和方法;也可以拥有自己特有的方法.
继承是单向的; 一个类只有一个父类; 子类能读取父类的方法与属性,但父类不能读取子类的方法和属性
3.3继承的语法:
// 定义一个父类
class Parent {
// 父类的属性和方法
}
// 定义一个子类,使用 extends 关键字继承父类
class Child extends Parent {
// 子类的属性和方法
}
四、多态
4.1 什么是多态
Java的多态是一种实现不同对象对同一消息的不同响应的机制,它可以让一个方法或者一个对象具有多种形态;同一个引用类型,使用不同的实例而执行不同操作。
4.2多态实现
使用多态实现思路;编写父类;编写子类,子类重写父类方法;运行时,使用父类的类型,子类的对象
4.3多态语法:
// 定义一个父类
class Parent {
// 定义一个方法
public void method() {
// 父类的方法实现
}
}
// 定义一个子类,使用 extends 关键字继承父类
class Child extends Parent {
// 重写父类的方法
@Override
public void method() {
// 子类的方法实现
}
}
// 创建一个父类类型的引用,指向一个子类类型的对象
Parent p = new Child();
// 调用引用的方法,会根据对象的实际类型来执行子类的方法
p.method();