面向对象的三大特征
封装
优点:
1、保护内部
2、方便使用
3、降低耦合度
什么是封装?
即包装
代码中有哪些地方体现了封装?
变量封装了这一个数据
方法封装了这一段代码
类封装了这多个属性与方法
文件封装了这多个类
包装封装了这多个文件
......
访问权限修饰符:
public 公共的 整个项目中
protected 受保护的 同一个包中或继承关系中
不写 默认的 同一个包中
private 私有的 当前类中使用
包
本质:一个存放Java文件的文件夹
如何创建一个包?
选择项目中的src文件夹,点击鼠标右键,选择new,选择package
包名:
要求:全部小写,不要使用数字开头,不要使用中文和特殊符号
潜规则:com.公司名称缩写或项目名称缩写.作用
注意:表示下层文件夹
package:包,该类所属的包
import:导包,当前类中使用的其他类所在的包,如果是同一个包中的文件夹,无需导包。
继承
由来:
Java的最终类:Object,一个类没有明确的继承关系,默认继承与Object
优点:
当子类继承父类时,将拥有父类所有的属性与方法,构造函数除外
语法:
class 子类名 extends 父类名{
子类属性
子类方法
}
注意:
一个类的直接父类只能有一个
子类无法直接调用父类私有的属性与方法
子类与父类不在同一个包中时,无法直接使用父类默认的修饰符修饰的属性与方法
子类继承父类时,必须有继承关系
super
表示:父类对象
作用:
1、当子类属性名或方法名与父类的属性名或方法名一致时,可以用于区分子类属性还是父类属性,子类方法或父类方法
2、调用父类属性或父类方法
3、当局部变量与父类属性名相同时,区分是局部变量还是父类属性
4、在构造函数中调用父类的构造函数
注意:
1、在构造函数中使用super调用父类构造函数,必须在第一行
2、如果一个构造函数中同时想使用this或super调用构造函数,请选择
3、如果子类的构造函数中没有调用父类的构造函数,系统默认帮你添加super();
父类;(基类,根类)
子类:派生类
重写
要求:
1、必须有继承关系
2、访问权限修饰符不可变小
3、返回值类型相同
4、方法名相同
5、形参列表相同
6、方法体相同
注解:@Ovverride
多态
意义:一个事物的多种形态
优点:
提高代码复用性
使代码更加灵活
转型:
向上转型
子类对象转父类对象
没有风险
自动转型
向下转型
父类转子类
有风险
强制转换
instanceof
作用:判断该对象是否属于该类
语法:
boolean b = 对象名 instanceof 类名
如果b为true表示该对象属于该类,反之不属于
在继承关系中对象的创建过程(了解)
1、在堆内存中开辟一片内存空间
2、父类属性赋初值
3、调用父类构造函数
4、子类属性赋初值
5、调用子类构造函数
6、将内存地址赋值给变量
练习:
1,声明变量记录数据10
int i = 10;
2,键盘录入一个变量,计算录入变量与1中变量的和
Scanner scanner = new Scanner(System.in);
System.out.println("请输出一个数");
int b = scanner.nextInt();
int n = i + b;
3,判断2中和值是否大于17,如果大于17输出成年,否则未成年
if(n > 17){
System.out.println("成年");
}else{
System.out.println("未成年");
}
4,将以上代码重复执行30次
for(int j = 30; j > 0; j--){
int i = 10;
Scanner scanner = new Scanner(System.in);
System.out.println("请输出一个数");
int b = scanner.nextInt();
int n = i + b;
if(n > 17){
System.out.println("成年");
}else{
System.out.println("未成年");
}
}
5,封装一个方法,用于计算两数之差,并调用
public static void add(){
int a = 10;
int b = 15;
System.out.println(a-b);
}
add();
public static void add(int a,int b){
System.out.println(a-b);
}
add(12,1);
public static int add(int a,int b){
return a-b;
}
int num = add(12,1);
6,存储一个可以存放1,2,3,4,5,6,7,8,9的数据,并遍历输出
int[] nums = {1,2,3,4,5,6,7,8,9};
for(int n : nums){
System.out.println(n);
}
for(int i = 0; i < nums.length; i++){
System.out.println(nums[i]);
}
7,创建张三这个对象,张三年龄25,性别男,会吃饭
class Person{
String name;
int age;
String sex;
public void eat(){
System.out.println(this.name+"吃饭");
}
}
pubic static void main(String[] args){
Person p = new Person();
p.name = "张三";
p.age = 25;
p.sex = "男";
p.eat();
}
8,将张三的属性进行封装,使其外部不能直接调用,需要通过方法进行调用
9,创建旺财这个对象,年龄2,性别公,会叫,叫声汪汪汪
10,抽取张三与旺财的共同点形成父类,并用继承改写8,9
public class Demo{
public static void main(String[] args) {
Person person = new Person();
person.setName("张三");
person.setSex("男");
person.setAge(18);
person.eat();
Dog dog = new Dog("旺财","公",3,"黄");
dog.call();
}
}
public class Dog extends animal {
public Dog(String name, String sex, int age,String color) {
super(name,sex,age,color);
}
public void call() {
System.out.println(getName()+"会叫:汪汪汪,性别为:"+getSex()+",年龄为:"+getAge()+",毛发为:"+getColor()+"色");
}
}
public class animal {
private String name;
private String sex;
private int age;
private String color;
public animal() {
super();
}
public animal(String name, String sex, int age, String color) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
