2021.07.09 Java学习笔记

关于packeage 的一些说明

包package与导入import
1.包机制: 文件夹
    1) 便于管理众多的资源
    2) 提供了多重的命名空间

  命名规范:
    公司域名倒着写    com.xxxx.xxxx

 包信息存在与java文件的首行

2.导包 : 指明要使用的类的位置
    import 包名.类名;
    位置: 类对的上面,包信息的下面

    1)使用的时候指明类的权限定名,完整路径
        只能在当前只一次使用有效

         java.util.Scanner sc = new java.util.Scanner(System.in);
    2)import 包名.类名;
    3)模糊匹配 *
        模糊匹配当前包下的所有类  import java.util.*;
        影响编译效率不会影响运行效率
    4)静态导入
        只能导入某个类中的静态内容

Private 关键字

private 私有的 :
        成员修饰符,不能修饰局部
        成员只能在本类中使用

    提供公共的访问方式:
        公共的成员方法(非静态)
        设置器 setter
        访问器 getter

    私有的属性,配合公共的访问方式提供成员的安全性

    面向对象的三大特性: 封装   继承   多态
        属性私有化配合公共的访问方式就是封装的具体体现
        方法,类..都是封装的体现
        私有是封装,封装不一定是私有

    封装:
        隐藏内部的实现细节,对外提供公共的访问方式

    封装的优点:
        1.提高安全性
        2.提高了复用性

    注意: 未来所定义的javabean类,所有的属性都应私有化,并提供公共的访问方式
    
        JavaBean 定义规范:
        1.类是公共的
        2.至少提供一个构造器
        3.私有的属性
        4.公共的访问方式

例如代码如下:

public class Class001_Person {
    public static void main(String[] args) {
        Person p = new Person();

        p.name = "zhangsan";
        //p.age = -18;
        p.setAge(20);
        p.show();

        System.out.println(p.getAge());

    }
}

class Person{
    public String name;
    //私有的属性
    private int age;

    public Person(){
    }

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    //设置器
    //为私有的age属性赋值
    public void setAge(int age){
        if(age<0 || age>150){
            return;
        }
        this.age = age;
    }

    //访问器
    public int getAge(){
        return this.age;
    }


    public void show(){
        System.out.println(name+"-->"+age);
    }
}

extends 继承

子承父业

     作用: 子类一旦继承父类,就有权使用父类中的内容
      子类中可以扩展自己独有的内容  延续+扩展

定义: 子类 extends 父类

      为什么要定义继承: 为了提高代码的复用性

      父类 | 基类 | 超类 : 被继承的类
      子类 | 派生类 : 继承父类的类

特点:
        java中的继承是单继承机制

优点: 简单
缺点: 不变与后期维护,不够灵活

          一个子类只能存在一个直接父类
          一个父类可以存在多个子类

        面向对象的设计原则之一:
            开闭原则 : 对修改关闭,对扩展开放


        javabean : 抽取一系列对象的共性
        父类: 子类的共性

public class Class001_Extends {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();

        teacher.name = "马云";
        teacher.age = 30;
        teacher.subject = "英语";

        teacher.teach();
        teacher.sleep();

        teacher.show();
    }
}

//父类
class Person{
    public String  name;
    public int age;

    public void sleep(){
        System.out.println("休息");
    }
}

//教师类
class Teacher extends Person{
    public String subject; //教授学科

    public Teacher(){}

    public void teach(){
        System.out.println("教书育人");
    }

    public void show(){
        System.out.println(name+"-->"+age+"-->"+subject);
    }
}

//学生类
class Student extends Person{
    public int id; //学号

    public Student(){}

    public void study(){
        System.out.println("学习...");
    }

}

 super

super 与  this 之间的区别:
        this  指代当前对象
        super 指代父类对象

先静态后成员
    在子父类关系下,创建子类对象 : 先父类后子类 (在子类内存空间中存储父类对象,可以通过super在子类中使用父类对象)
    super需要在子类中使用

1.在子类的构造器首行通过super调用父类的执行构造器
        super(参数列表)
        默认在子类构造器的首行会调用父类的空构造 super()
        在子类构造器的首行不能同时显示存在this()与super(),因为都需要定义在首行第一个条语句

    2. super区分子父类中同名成员问题
        如果子父类中出现同名的成员,子类中使用这个成员,默认就近原则
        如果想要调用父类同名成员,通过super.调用父类成员 (super指代子类内存中的

            默认就近原则找局部
            可以通过this.调用本类成员
            可以通过super.调用父类成员
        如果不存在同名问题,指代父类成员可以省略super.
        如果不存在同名问题,知道子类成员可以省略this.

public class Class002_Super {
    public static void main(String[] args) {
        Apple f = new Apple("红富士");
        f.show();
    }
}

//父类
class Fruit{
    public String type;
    public String color;
    public String haha = "父类哈哈";

    public Fruit(){
        System.out.println("父类构造器");
    }

    public Fruit(String type){
        System.out.println("父类带参造器");
        this.type = type;
    }
}

//子类
class Apple extends Fruit{
    public String haha = "子类哈哈";

    public Apple(){
        //super();
        System.out.println("子类构造器");
    }

    public Apple(String type){
        super(type);
        System.out.println("子类带参构造");
    }

    public void show(){
        System.out.println(super.type+"-->"+color);

        //局部变量
        String haha = "局部哈哈";
        System.out.println(haha); //局部
        System.out.println(this.haha); //本类成员
        System.out.println(super.haha); //父类成员
    }
}

 Override 重写

重写和重载的区别:

        重载:
                1.同一个类中的多个方法
                2.方法名相同
                3.参数列表不同|方法签名不同

         重写:
                1.不同的两个类
                2.继承|实现关系
                3.方法签名相同

        子类对父类某个功能满意,但是对他的功能实现不满意,可以在子类中对这个功能进行重新实现这就是重写

         使用特点: 子类引用会调用子类中重写的方法,子类没有找父类,子类有找子类,会对父类中的方法进行屏蔽

          如何检查一个方法是否是重写方法:
                1.在行号的后面显示,点击会跳转到对应被重写的方法位置
                2.@Override 强制检查一个方法是否为重写方法

 详细要求:
         == 方法签名
         <= 返回值类型 :
              基本数据类型 : 完全相等
              引用数据类型 : 子类中重写方法的返回值类型 <= 父类中被重写方法的返回值类型
              没有返回值类型 : 完全相等
         >= 权限修饰符 :
              子类中重写方法的权限修饰符 >= 父类中被重写方法的权限修饰符

不能被重写的方法:
      1.被private修饰的方法不能被重写
      2.被final修饰的方法不能被重写
      3.被static修饰的方法不能被重写
         子类中如果存在与父类静态方法同名的方法,要求子类中的同名方法也需要被static修饰

public class Class001_Override {
    public static void main(String[] args) {
        SiCong cong = new SiCong();
        cong.words();
    }
}

class JianLin{
    public String name = "王健林";

    JianLin words(){
        System.out.println("先定一个小目标,挣它一个亿...");
        return null;
    }
}

class SiCong extends JianLin{
    public String name = "王思聪";

    //重写方法
    @Override
    public JianLin words(){
        System.out.println("我不在乎我的朋友有钱没钱,反正没我有钱...");
        return null;
    }
}

 访问权限修饰符

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

  • public : 对所有类可见。使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

 访问权限修饰符:
        成员的被访问权限
        成员修饰符,不能修饰局部

                               不同包下的其他类          本类               同包类                 不同包下的子类                  
 公共的   public               √                                  √                   √                      √                        受保护的 protected        √                                 √                    √
 默认的  default               √                                 √
 私有的  private               √

        能够修饰的类的 : public , default(省略,不会显示)
        私有的内容能被继承,但是无权使用
        受保护的成员 :
                    1.同包类
                    2.在不同包的子类中,通过继承关系访问
        常用的权限修饰符:
                        public
                        private
              
          通过父类对象无法访问父类中受保护的成员  :

          在子类中,但不是通过继承关系
                 1)在子类中使用  

                 2)通过继承关系使用

 如下

package com.yjx.modifier04;

public class Class001_Modifier {
    public String testPublic = "public";
    protected String testProtected = "protected";
    String testDefault = "default";
    private String testPrivate = "private";

    public static void main(String[] args) {
        Class001_Modifier cm = new Class001_Modifier();
        System.out.println(cm.testDefault);
        System.out.println(cm.testPrivate);
        System.out.println(cm.testProtected);
        System.out.println(cm.testPublic);
    }

    public void test(){
        System.out.println(testDefault);
        System.out.println(testPrivate);
        System.out.println(testProtected);
        System.out.println(testPublic);
    }
}

//同包类
class Demo {
    public static void main(String[] args) {
        Class001_Modifier cm = new Class001_Modifier();
        System.out.println(cm.testDefault);
       //System.out.println(cm.testPrivate);
        System.out.println(cm.testProtected);
        System.out.println(cm.testPublic);
    }
}
package com.yjx.modifier05;

import com.yjx.modifier04.Class001_Modifier;

/*
    不同包下的其他类
 */
public class Class001_Other {
    public static void main(String[] args) {
        Class001_Modifier cm = new Class001_Modifier();
        //System.out.println(cm.testDefault);
        //System.out.println(cm.testPrivate);
        //System.out.println(cm.testProtected);
        System.out.println(cm.testPublic);
        //1)通过继承关系  2)不是在子类中使用
        Class002_Son  son = new Class002_Son();
        //System.out.println(son.testProtected);
        System.out.println(son.testPublic);
    }
}
package com.yjx.modifier05;

import com.yjx.modifier04.Class001_Modifier;

/*
    不同包下的子类
        测试: 测试通过继承关系在子类中使用父类中受保护的成员
 */
public class Class002_Son extends Class001_Modifier{
    public static void main(String[] args) {
        //通过父类对象无法访问父类中受保护的成员  : 在子类中,但不是通过继承关系
        Class001_Modifier cm = new Class001_Modifier();
        //System.out.println(cm.testProtected);
        System.out.println(cm.testPublic);

        //1)在子类中使用  2)通过继承关系使用
        Class002_Son  son = new Class002_Son();
        System.out.println(son.testProtected);
        System.out.println(son.testPublic);
    }

    public void test(){
        //System.out.println(testDefault);
        //System.out.println(testPrivate);
        System.out.println(testProtected);
        System.out.println(testPublic);
    }
}

Final 关键字

        final可以修饰成员可以修饰局部

                1.被fianl修饰的变量为常量
                2.被final修饰的方法不能被重写
                3.被final修饰的类不能被继承-->太监类

public class Class001_Final {
    static final Num  N = new Num();

    public static void main(String[] args) {
        //引用n指向一个新的对象
        //N = new Num();
        //修改对象的成员,但是指向的对象没变
        N.num--;

    }
}

class Num{
    int num = 100;
}

 Object 类

老祖宗类
        是java中所有类的父类
        java中的类都会直接或者间接的继承自Object类
        如果一个类没有显示的继承自其他类,默认继承自Object类

 toString()  把对象数据转为字符串的表现形式
        如果直接打印一个引用,默认打印的是这个调用toString方法的返回值
        需求: 以一个字符串展示一个对象,想要了解到对象的一些基本的信息(成员变量的值)
        Object类中的toString方法的实现: 默认以对象的地址展示
            public String toString() {
                return getClass().getName() + "@" + Integer.toHexString(hashCode());
            }
        子类中重写toString方法,实现返回对象的成员变量的值非地址值

equals 比较两个对象是否相等
        Object 类中equals默认比较 : 对象的地址
                                public boolean equals(Object obj) {
                                    return (this == obj);
                                }
        如果不想比较对象的地址,想要比较所有成员变量的值,可以在子类中重写equals方法 

  equals与==之间的区别:
             == : 基本数据类型比较数据值
             引用数据类型比较对象的地址值

   equals : 只能比较引用数据类型
                默认比较对象的地址
                可以通过重写实现比较对象内容(成员变量的值)

     注意: 以后要在javabean类中重写toString()与equals()方法

public class Class001_Object01{
    public static void main(String[] args) {
        //toString
        Person p = new Person();
        p.name = "zhangsan";
        p.age = 19;
        System.out.println(p.toString());
        System.out.println(p);

        Person p2 = new Person(); //0x001
        p2.name = "zhangsan";
        p2.age = 19;

        //比较两个person对象,不想比较地址,想要比较姓名
        System.out.println(p.equals(p2)); //0x001
        System.out.println(p==p2);
    }
}

class Person{
    public String name;
    public int age;

    public Person(){}


    public void show(){
        System.out.println(name+"-->"+age);
    }

    //重写方法
    @Override
    public String toString() {
        return name+","+age;
    }

    //比较两个person对象,不想比较地址,想要比较人的姓名,姓名相等就像等
    @Override
    public boolean equals(Object obj) {  //Object obj = 0x001;
        //增强程序健壮性  如果两个的指向的内存地址相等,就直接放回正确
        if(this == obj){
            return true;
        }

        //判断obj指向的是一个Person对象么??
        if(obj instanceof Person){
            //如果是就把obj从Object转为Person类型
            Person p = (Person)obj;  //Person p = 0x001;
            //可以调用Person类中的成员
            String name2 = p.name;
            String name1 = this.name;
            return name1.equals(name2);
        }
      return false;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值