认识类
1、访问修饰符
- 访问修饰符有四个private、default、protected、public;
- private:被private修饰的表示只能在本类中访问;
- default:被default修饰的表示只能在本包访问;
- protected:被protected修饰的表示只能在本包中访问,要在其他包中使用必须继承;
- public:被public修饰的表示可以在任何地方中访问。
2、包:
- 包的本质是一个文件夹,Java中不允许有同名的类出现,于是便有了包的概念,我们可以在不同包中创建同名得类。如何使用不同包中的同名的类呢?这就需要引入。
3、引入(import):
- 引入的作用主要就是用来引入不同包中的类的,类在同一个包中不需要引入。Java中使用任何类都需要引入,Java一般都会默认引用Java.lang.*, *代表所有的类,但是不包括子包中的类。
- 所有代码只能写在类当中,而有两个例外,一个是包语句,另一个就是Import语句。
4、属性访问器
- 有些类中的的属性不是公有的没有办法直接访问,这时候就会用到属性访问器,也就是getter和setter方法。
- 在类中定义个getter方法来获取属性;定义个setter方法来修改属性。
下面展示getter和setter方法
。
public class Person {
private String name = "张三";
public int age = 10;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(){
System.out.println("我是爸爸");
}
}
5、继承
- 继承是面向对象语言的主要特点之一,继承的主要特点就是用来省写代码。
- 如何继承?用extends关键字来实现继承,被继承的类称为超类或父类,继承的类称为子类。
下面展示类的继承
,继承的是上面那个Person类。
public class Man extends Person{
public Man() {
System.out.println("我是儿子");
}
}
- 那么有哪些特征被继承下来了呢?
public class Test {
public static void main(String[] args) {
Man m = new Man();
int i = m.age;
m.setName("张麻子");
m.getName();
}
}
- 可以看到Man类中什么也没写但是却有属性和方法可以调用,但是却没有Person类中的name属性,所以它继承了它父类中的公有的属性和方法,name属性是私有所以没有被继承。所以类的继承除了私有的和构造器(构造函数)不能继承,其他的都可以继承。
- 但其实我们没有给Man这个类中定义name属性它却可以设置name属性和得到name属性,可以推测其实它也继承了它的父类中的这个私有的name只不过我们看不到罢了。
- 类的继承中,没有继承父类的构造函数,但是在在使用到自己的构造函数时却是先从父类的开始调用,例如:
public class Test {
public static void main(String[] args) {
Man m = new Man();
int i = m.age;
m.setName("张麻子");
}
}
运行结果:
先调用了父类的无参构造器再调用了自己的。
- 继承的分类:
像Man类继承Person类的用extends关键字来指明的叫做显示继承。
而没有用关键字的默认继承Object类叫做隐式继承。 在Java中Object类就像是一个树根,其他类基本间接或直接继承与它。
6、重载和重写
- 说到继承就必须说下方法的重载和重写了;
- 重载:就是在本类或被继承的类中方法的名字相同,但是参数不同。
- 重写:就是在继承的类中方法的名字必须和父类相同,但是必须重写父类的方法。
- 重载:
public void sing(){
System.out.println("爸爸在唱歌");
}
public void sing(String name){
System.out.println(name + "在唱歌");
}//这就是方法的重载,在Person类中定义了两个同名方法,但参数不同。
重写:
public class Man extends Person{
public Man() {
System.out.println("我是儿子");
}
public void sing(){
System.out.println("儿子在唱歌");
}
}//Man类重写了父类的Person中的无参sing()方法
子类在重写父类方法时要注意,可以做到两小一大:
- 返回值只能缩小不能放大。
- 抛出异常的范围只能缩不能放大。
- 访问修饰符只能放大不能缩小。
7、父类引用指向子类对象和多态
- 当
Person p = new Man();
时调用的是谁的属性?谁的方法?
public static void main(String[] args) {
Person p = new Man();
p.sing();
System.out.println(p.age);
}
结果如下:
我是爸爸
我是儿子
儿子在唱歌
10
由此说明引用的是父类的属性和子类的同名方法。
- 而由此引出一个概念多态
- 多态:同一个方法在不同类中的不同的表现形式。类似上面那个例子。
- 多态存在的必要条件:
子类必须重写父类的方法
父类引用必须指向子类对象。
- 多态存在的必要条件: