面向对象的三大特征:封装、继承、多态
定义类的注意事项
用来描述一类事物的类,专业叫做:Javabean类//在javabean中,是不写main方法的
编写main方法的类,叫做测试类
//在测试类中创建javabean类的对象并进行赋值调用
-
类名采用驼峰命名法
-
实际开发中建议一个文件定义一个class类
-
变量定义的格式:修饰符 数据类型 变量名称 = 初始化值;一般存在默认值可以不定义初始值
使用小技巧
psvm // 快速补全main代码
sout // 补全System.out代码
鼠标滚轮/Alt+左键 //竖向选择
封装
正确的设计对象的属性和方法
在实际开发当中会设计多给对象
-
对象代表什么,就得对应什么数据,并提供数据对应的行为
-
找对象,用方法
比如人画圆
意思为人调用了画圆的方法做了一个圆(很重要的思想)——及面向对象
再比如,张三砍了李四——XX持刀行凶,造成了什么后果 及张三调用了行凶的方法,造成了李四的死亡
private 关键字//私有 目的:保障数据的安全性 1.是一个权限修饰符 2.可以修饰成员变量和成员方法 3.被 private 修饰的成员只能在本类中访问 public //公共
-
针对于每个私有化的成员变量,都要提供get和set方法进行修饰
-
set方法:给每个成员赋值
-
get放法:对外提供成员变量的值
this关键词
成员变量、局部变量
public class GirFriend{
private int age;//成员变量
public void menthod(){
int age = 10;//局部变量
System.out.println(age);
}
}
//注意成员变量和局部变量重名的时候采用
//就近原则
//System.out.println(age)离age = 10进则输出的结果是10
//当重名时若要使用成员变量中的age,则在age前加入this关键字
@@@如下
public class GirFriend{
private int age;
public void menthod(){
int age = 10;
System.out.println(this.age);//修改处
}
}
//此时的输出结果即为0
this的作用
区分成员变量和局部变量
this的本质:自查
构造方法
构造方法也叫做构造器、构造函数
作用:在创建对象的时候给成员变量赋值
-
定义
-
如果没有定义构造方法,系统将给出一个默认的无参的构造方法
-
如果定义了构造方法,系统将不再提供默认的构造方法
-
-
重载
-
带参构造方法,和无参构造方法,两者方法名相同,但参数不同,这叫做构造方法的重载
-
-
使用规范
-
无论是否使用,都手写无参构造方法和带参的全部构造方法
-
构造方法作用
创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的
//注意
//任何类定义出来,默认都自带了无参构造器,写不写都有
盲区:构造方法就是用来创建对象的 //误区
标准的JavaBean类
-
类名需要见名只意
-
成员变量用private修饰
-
提供至少两个构造方法
-
无参构造方法
-
带全部参数的构造方法
-
-
成员方法
-
提供每个成员变量对应的setXxx()/getXxx()
-
其他行为也需要写上
-
package yjw.SDUT.yjw;
public class User {
private int UserName;//驼峰式命名法
private String password;
private String emil;
private String age;
public User(){
}//空参
public User(String password,String emil,String age){
this.age=age;
this.emil=emil;
this.password=password;
}//全参
public void setPassword(){//注意set为赋值方法于get区分
this.password=password;
}
//等等
//快捷键ALt+Fn+Insert(不同电脑区分)
//或者使用插件PTG(idea中)
}
this的内存原理
this的作用:区分局部变量和成员变量
this的本职:所在方法调用者的地址值
成员变量和局部变量的区别
成员变量:类中方法外的变量
局部变量:方法中的变量
非重点
static
static表示静态的意思
被static修饰的成员变量,叫做静态变量:
特点:
-
该类所有对象共享
-
不属于对象,属于类
-
随着类的加载而加载,优先于对象存在
调用方法
-
类名直接调用
-
对象调用
如班里所有的同学和老师的关系
public class Student{
String name;
int age;
static String teacherName;
public void show(){
System.out.print(teacherName);
}
}
public class Test{
public static void main(String[]args){
Student.teacherName = '阿伟';
Student s1 = new Student();
s1.name = '张三';
s1.age = 23;
Student.s2 = new Student();
s2.show(``````````);
}
}
//s2的输出为‘阿伟’
//不难看出静态变量被所有对象共享
被static修饰的成员方法,叫做静态方法:
-
多用于测试类和工具类中
-
Javabean
类中很少用
调用方法
-
类名调用
-
对象名调用
注意事项
-
静态方法中没有this关键字
-
非静态方法可以访问所有
-
静态方法中,只能访问静态
但this
在非静态无参方法中可调用,由虚拟机赋值,表示当前方法调用者的地址值
展开:
Javabean
类:用来描述一类事物的类,Student,Teacher等
测试类:用来检查其他类书写是否正确
工具类:不是用来描述一类事物的,而是帮我们做一些事情的类(不懂)
简单而言就是调用函数用
快捷键 | 作用 |
---|---|
ctrl +alt +v | 快速补全类和对象名 |
ALt + Insert | 构造函数的快速补全 |
Alt + Enter | 快速修复 |
Alt + 鼠标选择 | 多行编辑 |
重新认识mian
方法
继承
java
提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立继承关系
实际开发当中不要把多个方法放在一个类中,要符合实际情况,否则工作时绝对会挨骂(笑)
继承的好处
-
子类中重复的代码抽取到父类中,提高代码的复用性
-
子类在父类的基础上,增加其他的功能,使子类更加强大
继承中成员变量的访问特点:就近原则
重载和重写是Java中两个重要的概念。重载可以实现本类内的方法多态性,重写可以实现子类或实现类的多态性。
-
重写(override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
-
重载(overload) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
构造方法的访问特点:
-
父类中的构造方法不会被子类继承
-
子类中所有的构造方法默认先访问父类中的无参构造,在执行自己
调用父类构造方法:
-
子类构造方法第一行默认都是super(),不写也存在,且必须在第一行
-
若有想调用父类有参构造,必须手写super进行调用
多态
同种类型的对象,表现出来的不同形式
父类类型 对象名称 = 子类对象
前提:
-
有继承关系
-
有父类引用指向子类对象
Fu f = new Zi();
-
有方法重写
多态调用成员的特点
-
变量调用:编译看左边,运行优先看左边
-
方法调用:编译看左边,运行优先 看右边
好处:
-
多态形式下,右边对象可以实现解耦合,便于扩展和维护
-
定义方法的时候,使用父类型作为参数,可以接受所有子类对象
弊端
-
不能调用子类当中的特有方法(成员方法,父类中不存在)
-
解决方案:转换成子类类型即可
-
instanceof
关键字:判断变量类型
a instanceof Person
// 若类型相同,返回true
//否则返回false
常用写法
a instanceof Person b
//先判断a是否为Person类型,如果不是则强制转换
以此进行父子类的转换
包
用于管理不同功能的java
类,方便后期维护
-
使用同一个包中的类时,不需要导包
-
使用
java.lang
包时不需要导包 -
其余情况需要导包
-
如果两个类包中类名相同,需要全类名
final
特点:不可改变
使用时:
-
方法:表明该方法是最终方法
-
类:表面该类是最终类
-
变量:叫常量,只能赋值一次
如:
final class Fu{
public final void show(){
System.out.println("父类的show方法");
}
}//该函数则不可修改
//同理将类加上final则该类不可继承
final int a = 10;
但是当final
修饰的变量是引用类型时,则变量储存的地址值不能发生改变,但对象内部的可以改变
如:
final Student S new = Student("Zhangsan",23);
S.setName("Lisi");
S.setAge(24);
//该代码不会报错
// 同理final定义数组后也可求改其内容