目录
注意:
每个对象具有三个特点:对象的属性,对象的功能和对象的标识。
- public class Test1 {
- public static void main(String[] args) {
- //对象的创建
- Phone p=new Phone();//对象的标识
- System.out.println(p.price);//对象的属性
- p.call();//对象的行为
- }
- }
- class Phone{
- //2.定义手机类的属性--用成员变量来描述--位置:类里方法外
- String brand;//品牌
- double price=3;//价格
- double size;//尺寸
- String color;//颜色
- //3.定义手机类的功能--用方法来描述--格式:修饰符 返回值类型 方法名(参数列表){方法体}
- public void call(){
- System.out.println("正在打电话~");
- }
- public void message(){
- System.out.println("正在发短信!");
- }
- public void video(){
- System.out.println("正在看直播~");
- }
- }
注意:new关键字实际上在调用一个方法,这个方法叫做构造方法(构造器)
Person p = new Person();//短短这行代码发生了很多事情
方法名与类同名,且没有返回值类型,参数列表可以含参也可以不含参
- 方法修饰符 方法名(参数列表){//注意方法名与类名相同
- 方法体;
- }
- public class Test1 {
- public static void main(String[] args) {
- //对象的创建
- Phone p=new Phone("三星",88,22,"绿色");
- System.out.println(p.color);//绿色
- }
- }
- class Phone{
- //全参构造
- public Phone(String brand, double price, double size, String color) {
- this.brand = brand;
- this.price = price;
- this.size = size;
- this.color = color;
- }
- //含参构造
- public Phone(double price, double size) {
- this.price = price;
- this.size = size;
- }
- //无参构造
- public Phone() {
- }
- //2.定义手机类的属性--用成员变量来描述--位置:类里方法外
- String brand;//品牌
- double price;//价格
- double size;//尺寸
- String color;//颜色
- }
Java把内存分成5大区域,我们重点关注栈和堆。
- public class Person{
- int id;
- int age;
- public static void main(String[] args) {
- Person person = new Person();
- }
- }
理解:首先进入main方法,在栈区为main方法分配栈帧为main栈帧,加载Person类的字节码信息Person.class到方法区然后以其为模板在堆内创建Person对象并为其分配一个地址p,并且p指向Person.class说明是以此为模板创建的对象,创建对象同时并完成值得初始化,之后调用构造器方法在栈帧内虚晃一枪,然后在main栈帧中开辟空间存放Person对象的地址值命名为person,将person压入栈底,之后就可以通过person来访问Person对象了
概念:this代表本类对象的一个引用对象(本类对象的东西)
this.属性名=属性值;
- public class Person{
- int id=2;
- public void eat(){
- System.out.println("吃饭饭");
- }
- @Test
- public void test1(){
- int id=8;
- System.out.println(id);//8
- System.out.println(this.id);//2
- eat();
- }
- }
注意:
语法:this();
注意:
- public class Test1 {
- public static void main(String[] args) {
- //3.1触发无参构造创建本类对象
- Dog d1 = new Dog();
- //3.2触发含参构造创建本类对象
- //Dog d2 = new Dog("旺财");
- }
- }
- class Dog{
- public Dog(){
- //无参构造
- this("小旺旺");
- System.out.println("无参构造");
- }
- //含参构造
- public Dog(String s){
- //不能两个this回调,否则会出现死循环
- //this();
- System.out.println("含参构造"+s);
- }
- }
- //含参构造小旺旺
- //无参构造
static是java中的一个关键字用于修饰成员变量和成员方法等
- public class Test {
- int id;
- static int sid;
- public static void main(String[] args) {
- Test t1 = new Test();
- t1.id=10;
- t1.sid=10;
- Test t2 = new Test();
- t2.id=20;
- t2.sid=20;//此时该类的变量已经为20
- System.out.println(t1.id);//10
- System.out.println(t2.id);//20
- System.out.println(t1.sid);//20
- System.out.println(t2.sid);//20
- //原理:static修饰的变量被全局共享
- Test.sid=80;
- System.out.println(Test.sid);//被static修饰的变量可以通过类名直接调用
- }
- }
- public class Demo {
- int id=2;
- static int sid=5;
- //普通方法访问静态非静态均可
- public void m1(){
- System.out.println(id);
- System.out.println(sid);
- System.out.println("方法1");
- }
- //静态方法只可访问静态变量
- static public void m2(){
- //System.out.println(id);//报错
- System.out.println(sid);
- System.out.println("方法2");
- }
- public static void main(String[] args) {
- Demo.m2();
- }
- }
代码块分类:局部代码块、构造代码块、静态代码块、同步代码块
语法:{ 代码… }
语法:static{}
静态资源随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
特点: 被static修饰,位置在类里方法外
静态代码块 --> 静态方法-->构造代码块 --> 构造方法 --> 局部代码块
注意:静态代码块与静态变量都存在,则会按照顺序合二为一执行,因为两者同级别
导包的作用:解决重名问题(实际上包对应的就是盘符上的目录)
创建包:idea中new Package
包声明:package 包名;(供外界使用,一定要加)
导包:import 包名.类名;(供自己使用)
- import static java.lang.Math.random;
- public class Pkg {
- public static void main(String[] args) {
- System.out.println(random());//1000
- }
- public static int random(){
- return 1000;
- }
- }
含义:将某些东西进行隐藏,然后提供相应的方式进行获取
好处:
是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问
如何封装:我们可以使用private等关键字来封装成员变量与方法
如何访问封装的成员变量:通过get/set方法
- public class Test1 {
- public static void main(String[] args) {
- User u = new User();
- //修改对象的属性值,可以直接修改
- u.name = "李逵";
- //可以直接访问
- System.out.println(u.name);
- //封装属性的修改与访问
- u.setSex("男");
- System.out.println(u.getSex());
- }
- }
- class User{
- String name;
- //封装属性--通过private关键字封装属性
- private String sex;
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- if("男".equals(sex)||"女".equals(sex)){
- this.sex = sex;
- }else{
- this.sex="男";
- }
- }
- public User() {
- }
- public User(String name, String sex) {
- this.name = name;
- //调用构造器时对设置的性别进行限制
- setSex(sex);
- }
- }
含义:用来控制一个类,或者类中的成员的访问范围。
作用:实现封装

注意:
含义:继承是从已有的类中派生出新的类,新类能吸收已有类的数据属性和行为,并扩展新的能力.
理解:将多个类的共同部分向上抽取形成一个大类,这个类就是被继承的父类,继承是对类的抽象
格式:子类 extends 父类
- public class Test1 {
- public static void main(String[] args) {
- Animal a = new Animal();
- Cat c = new Cat();
- MiaoMiao m = new MiaoMiao();
- a.eat();//爷爷类使用自己的方法
- c.eat();//爸爸类可以使用从爷爷类中继承过来的方法
- m.eat();//孙子类也可以使用从爷爷类中继承过来的方法
- }
- }
- class Animal{
- public void eat(){
- System.out.println("小动物Animal吃啥都行~");
- }
- }
- class Cat extends Animal{
- int a = 10;//普通属性
- private int b = 100;//私有属性
- }
- class MiaoMiao extends Cat{
- public void studyJava(){
- System.out.println("正在学Java");
- System.out.println(a);
- }
- }
定义:发生在子类和父类当中,当子类对父类提供的方法不满意的时候,要对父类的方法进行重写
两同:
两小:
注意:父类的方法的返回值类型若为基本数据类型则子类方法的返回值类型也为基本数据类型,父类方法的返回值类型为引用类型则子类方法的返回值类型为父类方法返回值类型的本类或子类
一大:子类方法的修饰符权限要大于等于父类被重写方法的修饰符权限
- public class Test1 {
- public static void main(String[] args) {
- Cat cat = new Cat();
- cat.eat();//猫cat吃啥都行~
- cat.run();//动物喜欢爬树
- }
- }
- class Animal{
- public void eat(){
- System.out.println("小动物Animal吃啥都行~");
- }
- public void run(){
- System.out.println("动物喜欢爬树");
- }
- }
- class Cat extends Animal{
- @Override//重写注解标识
- public void eat(){
- System.out.println("猫cat吃啥都行~");
- super.eat();
- }
- }

概念:父类对象的一个引用对象
理解:在子类方法中,可以通过super.属性/super.方法的方式显式的去调用父类提供的属性以及方法,通常情况下super.可以省略不写
语法:super.属性名=属性值;
- import org.junit.Test;
- public class Girl extends Person{
- String name="lala";
- public void getAge(){
- System.out.println(age);//这里的super.省略了(因为子类里没有)
- }
- @Test
- public void test1(){
- System.out.println(name);//lala
- System.out.println(super.name);//父类名字lili
- getAge();
- super.getAge();
- }
- }
- class Person{
- String name="lili";
- int age=8;
- public void getAge(){
- System.out.println("父类getAge");
- }
- }
调用的是父类的无参构造:super();
调用父类的含参构造:super(参数列表);
- public class Girl extends Person{
- String name;
-
- public Girl(String name,int age) {
- super(age);
- this.name = name;
- }
- }
- class Person{
- int age;
- public Person(int age) {
- this.age = age;
- }
- }
- class Test2{
- public static void main(String[] args) {
- Girl lili = new Girl("lili", 9);
- System.out.println(lili.name+lili.age);
- }
- }
注意:

注意:如果子类重写了父类的方法以后,可以使用super.方法名(参数列表)来调用
语法:final 属性名=属性值;
含义:指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
理解:父类当做方法的形参,然后传入具体的子类对象,调用同一个方法,根据传入子类的不同展现出方法的效果也不同,构成了多态
注意:多态与属性无关,多态指的是方法的多态,而不是属性的多态
多态的好处:为了提高代码的扩展性,符合面向对象的设计原则:开闭原则(扩展是开放的,修改是关闭的)
- public class Test1 {
- public static void main(String[] args) {
- Animal2 a=new Dog2();//向上转型
- a.eat();//小狗爱吃肉包子
- System.out.println(a.sum);//10
- System.out.println(((Dog2) a).sum);//20——向下转型
- }
- }
- class Animal2{
- int sum = 10;
- public void eat(){
- System.out.println("吃啥都行~");
- }
- public static void play(){
- System.out.println("玩啥都行~");
- }
- }
- class Dog2 extends Animal2{
- int sum = 20;
- @Override
- public void eat(){
- System.out.println("小狗爱吃肉包子");
- }
- //静态方法属于类方法,不存在重写
- public static void play(){
- System.out.println("小狗喜欢玩皮球~");
- }
- }
Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类;被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法.
抽象方法格式:权限修饰符 abstract 返回值类型 方法名(参数列表);
- public class Test1 {
- public static void main(String[] args) {
- Animal a = new Pig();
- a.eat();//调用抽象父类的普通方法
- a.fly();//调用抽象父类的抽象方法
- }
- }
- //抽象类
- abstract class Animal{
- public Animal() {
- System.out.println("我是父类构造");
- }
- //3.创建普通方法
- public void eat(){
- System.out.println("吃啥都行~");
- }
- public void play(){
- System.out.println("玩啥都行~");
- }
- //抽象方法
- public abstract void fly();
- public abstract void fly2();
- }
- class Pig extends Animal{
- @Override//注解,标识这是一个重写的方法
- public void fly() {
- System.out.println("我爸的债我终于还清了,我家的猪终于飞起来了~");
- }
- @Override
- public void fly2() {
- System.out.println("抽象父类中的所有抽象方法都需要被实现");
- }
- }
- //我是父类构造
- //吃啥都行~
- //我爸的债我终于还清了,我家的猪终于飞起来了~
含义:接口( Interface )在Java中也是一种抽象类型,接口中的内容是抽象形成的需要实现的功能,接口更像是一种规则和一套标准.
接口格式:interface 接口名{……代码……}
- public class Test4 {
- public static void main(String[] args) {
- UserInter u = new UserInterImpl();
- u.eat();
- u.play();
- System.out.println(u.age);
- UserInter.fly();
- }
- }
- interface UserInter{
- public static final int age = 20;
- public abstract void eat();
- void play();
- //静态方法
- static void fly(){
- System.out.println("一飞冲天");
- }
- //默认方法
- default void run(){
- System.out.println("一路顺风");
- }
- }
- //3.创建接口的实现类
- class UserInterImpl implements UserInter{
- @Override
- public void eat() {
- System.out.println("实现接口中的抽象方法1");
- }
- @Override
- public void play() {
- //实现类中调用接口的默认方法
- UserInter.super.run();
- System.out.println("实现接口中的抽象方法2");
- }
- }
- //实现接口中的抽象方法1
- //实现接口中的抽象方法2
- //20
- //一飞冲天
定义:内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对于A类来说就是一个内部类
定义:在成员位置的内部类是成员内部类
- public class Outer {
- private int id=10;
- public void out(){
- System.out.println("我是外部类方法");
- }
- class Inner{
- public void in(){
- System.out.println("我是内部类方法");
- }
- //内部可以获得外部类的私有属性
- public int getId() {
- return id;
- }
- //内部可以获得外部类的私有以及非私有方法
- public void get(){
- out();
- }
- }
- }
- public class Test {
- public static void main(String[] args) {
- Outer outer = new Outer();
- //通过外部类来实例化内部类
- Outer.Inner inner = outer.new Inner();
- //获得内部类方法
- inner.in();
- //获得外部类私有属性
- System.out.println(inner.getId());
- //获得外部类方法
- inner.get();
- }
- }
注意:成员内部类被Private修饰以后,无法被外界直接创建创建对象使用,所以可以创建外部类对象,通过外部类对象间接访问内部类的资源(private权限修饰符生效的为本类,这个本类就是指本外部类)
- public class Outer {
- private int id=10;
- public void out(){
- System.out.println("我是外部类方法");
- }
- //外部类使用内部类资源
- public void find(){
- //外部类无法直接获取内部类的属性及方法,如果要获取需要创建内部类对象
- //创建内部类对象
- Inner inner = new Inner();
- //获得内部类方法
- inner.in();
- //获得内部类属性
- System.out.println(inner.sum);
- }
- private class Inner{
- int id=20;
- private int sum=100;
- public void in(){
- System.out.println("我是内部类方法");
- }
- //内部可以获得外部类的私有属性
- public int getId() {
- System.out.println(id);
- //成员变量和外部类重名时获取外部类成员
- return Outer.this.id;
- }
- //内部可以获得外部类的私有以及非私有方法
- public void get(){
- out();
- }
- }
- }
- public class Test {
- public static void main(String[] args) {
- Outer outer = new Outer();
- outer.find();
- }
- }
- public class Outer {
- private int id=10;
- public void out(){
- System.out.println("我是外部类方法");
- }
- public static class Inner{
- public int sum=100;
- public static void in(){
- System.out.println("我是内部类方法");
- }
-
- }
- }
- public class Test {
- public static void main(String[] args) {
- //创建静态内部类对象
- Outer.Inner inner = new Outer.Inner();
- //访问静态内部类的属性
- System.out.println(inner.sum);
- //访问静态内部类里的静态资源
- Outer.Inner.in();
- }
- }
定义:在局部位置的内部类是局部内部类
- public class Outer {
- private int id=10;
- public void out(){
- final int num=100;
- System.out.println("我是外部类方法");
- class Inner{
- private int sum=100;
- private void in(){
- System.out.println(num);//在局部内部类中访问的变量必须是final修饰的变量
- System.out.println("我是内部类方法");
- }
- }
- //使用局部内部类的资源
- Inner inner = new Inner();
- System.out.println(inner.sum);
- inner.in();
- }
- }
注意:在局部内部类中访问到的变量必须是final修饰的变量 (原因:局部变量的生命周期与局部内部类对象的生命周期不一致,局部对象若想使用该局部变量,那么必须延长该局部变量的生命周期,伪延长方法:为局部变量加final修饰符将局部变量复制一份,复制品直接作为局部内部类中的数据成员)
- public class Test {
- public static void main(String[] args) {
- new Outer().out();
- }
- }
定义:没有具体名字的内部类
- public class Outer {
- public static void main(String[] args) {
- //创建匿名内部类——实现了该接口的实现类,并调用save方法
- new UserService(){
- @Override
- public void save() {
- System.out.println("我是save方法");
- }
- }.save();
- //创建匿名内部类——该抽象类的子类
- new Aclass(){
- @Override
- void delete() {
- System.out.println("我是delete方法");
- }
- };
- }
- }
- interface UserService{
- void save();
- }
- abstract class Aclass{
- abstract void delete();
- }
注意:匿名内部类属于局部内部类,而且是没有名字的局部内部类,通常和匿名对象一起使用