package cn.tedu.oop;
/*本类用于面向对象入门案例
* 在一个Java文件中可以写多个class,但是被public修饰的只能有一个
* 而且这个公共类的名字要求就是当前文件的名字*/
public class TestGreateClass {
public static void main(String[] args) {
//4.通过new关键字创建对应类的对象
Phone p = new Phone();
//5.通过创建好的对象使用类中的功能
p.call();
p.message();
p.video();
//6.通过创建好的对象查看属性值
System.out.println(p.brand);
System.out.println(p.price);
System.out.println(p.color);
System.out.println(p.size);
//7.创建手机类的第二个对象
Phone p2 = new Phone();
System.out.println(p2);
//8.通过p2对象调用Phone类的三个功能
p2.video();
p2.message();
p2.call();
//9.给p2对象的属性赋值并查看
p2.brand = "华为";
p2.price = 8888.88;
p2.size = 5.6;
p2.color = "宝石蓝";
System.out.println("手机品牌是:"+p2.brand);
System.out.println("手机颜色是:"+p2.color);
System.out.println("手机价格是:"+p2.price+"元");
System.out.println("手机大小是"+p2.size+"寸");
}
}
//1.通过class关键字创建手机类--用来描述手机这一类事物
//类是一类事物的抽象,用来描述这一类事物的特征与行为
class Phone{
//特征(属性)--类的成员变量来描述--定义在类方法外的变量
String brand;//品牌
double price;//价格
double size; //尺寸
String color;//颜色
//3.定义手机的功能--类的方法来描述--修饰符 返回值类型 方法名(参数列表){方法体}
public void call(){
System.out.println("正在打电话~");
}
public void message(){
System.out.println("正在发短信~");
}
public void video(){
System.out.println("正在看片~");
}
}
package cn.tedu.oop;
//本类用于面向对象巩固
public class TestCat {
public static void main(String[] args) {
Cat m = new Cat();
m.jump();
m.miaoMiao();
System.out.println(m);
//6.创建小猫的对象2
Cat m2 = new Cat();
m2.jump();
m2.miaoMiao();
m.name = "黑炭";
m.age = 3;
m.hosts = "静静";
m2.name = "煤球";
m2.age = 2;
m2.hosts = "爱丽丝";
System.out.println("小猫的名字是:"+m.name);
System.out.println("小猫"+m.age+"岁啦~");
System.out.println("小猫的主人是:"+m.hosts);
System.out.println("小猫的名字是:"+m2.name);
System.out.println("小猫"+m2.age+"岁啦~");
System.out.println("小猫的主人是:"+m2.hosts);
}
}
//1.通过class关键描述小猫这一类事物
class Cat{
//2.属性
String name;
int age;
String hosts;
//3.功能
public void jump(){
System.out.println("小猫跳的老高了");
}
public void miaoMiao(){
System.out.println("小猫喵喵叫~~~~");
}
}
package cn.tedu.oop;
/*本类用于继续测试面向对象的第一大特性--封装*/
public class TestPrivate2 {
public static void main(String[] args) {
//4.创建学生类对象
Student s = new Student();
//5.通过对象操作学生类的属性与方法
System.out.println(s.name);
s.study();
//6.1通过对象修改属性的值,并打印查看
// s.subject = "java培优";
// System.out.println(s.subject);
s.name = "陈平安";
System.out.println(s.name);
// s.sno = 20210929;
// System.out.println(s.sno);
//6.4 调用自动生成的set与get方法
s.setSubject("CGB");
System.out.println(s.getSubject());
//7.3调用get与set方法操作被封装的属性
s.setSno(21090929);
int r = s.getSno();
System.out.println(s.getSno());
}
}
//1.使用class关键字描述学生这一类型
class Student{
//2.学生属性:学号,姓名,科目
//7.1使用private关键字封装属性
private int sno;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
String name;
//6.2使用private修饰subject属性
private String subject;
//右键-Generate-getter and setter-再点那个锁-点ok
//7.2添加被封装属性的get和set方法
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
//3.学生功能:学习,吃饭,睡觉
public void study(){
System.out.println("别吵,学习呢~");
}
public void eat(){
System.out.println("干饭不积极,思想有问题~");
}
public void sleep(){
System.out.println("我一点也不想睡觉,我想学Java");
}
}
封装的必要性
package cn.tedu.oop;
//本类用于测试封装的必要性
public class TeatPrivate1 {
public static void main(String[] args) {
//3.创建对象修改属性值
User u = new User();
u.name = "葫芦娃";
System.out.println(u.name);
//u.money = 1000000;
//System.out.println(u.money);
//6.调用查看余额的方法
System.out.println(u.getMoney());
//7.调用设置余额的方法,设置余额为999999
u.setMoney(999999);
//设置完,通过获取money的方法再次查看余额值
System.out.println(u.getMoney());
}
}
//1.创建一个用户类
class User{
//2.定义用户类的属性
public String name; //姓名
//4.为了更安全的操作余额,修改money的修饰符为private
/*被private修饰的资源只能在本类中使用*/
private double money=10000;//账户余额
//5.1提供公共的方法共外界调用,方法的功能:获取余额
public double getMoney(){
/*如果方法的返回值不是void
* 就需要适应return关键字返回对应类型的返回值*/
/*后续可以增加权限的验证*/
return money;
}
//5.2提供公共的方法共外界调用,方法的功能:修改余额
public void setMoney(double newMoney){
/*后续可以添加权限的效验*/
money = newMoney;//将调用方法时传入的值newMoney设置给成员变量money
}
}
面向对象巩固练习
package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {
public static void main(String[] args) {
//4.在公共类当中创建汽车类对象
Car c = new Car();
//5.设置创建好的对象的属性值
// c.brand = "BWM";
// c.color = "黑色";
// c.price = 300000;
// c.length = 3.2;
//6.查看设置好的属性
// System.out.println(c.brand);
// System.out.println(c.color);
// System.out.println(c.price);
// System.out.println(c.length);
//7.3操作set方法给所有属性赋值
c.setBrand("布加迪威龙");
c.setColor("暗夜黑");
c.setPrice(40000000);
c.setLength(3.3);
//7.4操作get方法查看属性的赋值是否成功
System.out.println(c.getBrand());
System.out.println(c.getColor());
System.out.println(c.getPrice());
System.out.println(c.getLength());
//8.通过创建好的对象调用汽车类的功能
c.start();
//c.stop();
}
}
//1.抽象汽车这一类事物的共同点,用class描述
class Car{
//2.属性--用成员变量来描述
//7.1封装所有属性
private String brand;//品牌
private String color;//颜色
private double price;//价格
private double length;//车长
//3.功能--用方法来描述
public void start(){
System.out.println("汽车启动了~");
//9.2在本类的公共方法里调用被封装的方法
stop();
}
//9.1用private封装汽车停止的方法
private void stop(){
System.out.println("汽车停止了~");
}
//7.2生成所有属性对应的get和set方法
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
}
package cn.tedu.oop;
/*本类用作构造函数的入门案例*/
public class TestConstructor {
public static void main(String[] args) {
//4.创建Person类的对象
/*1.每次new 对象时都会自动触发对应类中的构造方法
* 2.每一个类中都会默认存在一个没有参数的构造方法
* 但是,如果你提供了其他的构造函数,默认的无参构造会被覆盖
* 所以,我们要手动的提供无参构造,这样才能不传参数,也能创建对象*/
Person p1 = new Person();
System.out.println(p1.name);
System.out.println(p1.age);
System.out.println(p1.address);
p1.eat();
/*4.每次创建对象都会执行一个构造方法
* 构造方法的作用:用来创建对象的*/
Person p2 = new Person(555);
System.out.println(p2.name);
/*5.全参构造不仅可以创建对象,还可以给对象的所有属性赋值*/
Person p3 = new Person("张三",18,"浙江");
System.out.println(p3.name);
System.out.println(p3.age);
System.out.println(p3.address);
}
}
//1.创建Person类,描述人这一类事物
class Person{
//2.定义属性
String name;//姓名
int age;//年龄
String address;//地址
/*3.构造方法的格式:与本来类名同名,且没有返回值类型的方法*/
//5.1创建本类的无参构造
public Person(){
System.out.println("我是Person类的无参构造");
}
//5.2创建本类的含参构造--含有参数的构造方法
public Person(int n){
System.out.println("我是Person类的含参构造"+n);
}
//5.3创建本类的全参构造--此构造函数的参数与本类的属性一致
//右键-Generate-Constructor-Shift全选所有属性-ok
public Person(String name, int age, String address) {
System.out.println("我是Person类的全参构造");
this.name = name;
this.age = age;
this.address = address;
}
//3.功能--方法
public void eat(){
System.out.println("端起了我的饭盆~");
}
}
package cn.tedu.oop;
/*本类用于测试代码块
* 执行顺序: 构造代码块>构造方法> 普通方法>局部代码块
* 1.当创建对象时,会触发构造函数
* 2.创建对象时,也会触发构造代码块,并且构造代码块优先于构造方法执行
* 3.我们创建好对象后才能通过对象调用普通方法
* 4.如果普通方法里有局部代码块,才会触发对应的局部代码块*/
public class TestBlock {
public static void main(String[] args) {
Pig p1 = new Pig();
Pig p2 = new Pig("佩奇");
Pig p3 = new Pig("肉包子",5);
System.out.println(p1.age);//0,默认值
System.out.println(p2.age);//0默认值
System.out.println(p3.age);//5,创建对象时赋值
p1.eat();
p2.eat();
p2.eat();
}
}
class Pig{
String food;
int age;
{
/*构造代码块:{}
* 1.位置:类里,方法外
* 2.执行时机:每次创建对象时都会执行构造代码块,并且构造代码块优先于构造方法执行
* 3.作用:用于提取所有构造方法的共性功能*/
System.out.println("我是一个构造代码块");
System.out.println("黑猪肉");
}
public void eat(){
System.out.println("小猪爱吃菜叶子");
{
/*
* 局部代码块:{}
1.位置:在方法里
2.执行时机:调用本局部代码块所处的方法时才会执行,并且构造方法优先于局部代码块执行
3.作用:用于控制变量的作用范围,变量的作用范围越小越好
*/
System.out.println("我是一个局部代码块");
int i = 100;
System.out.println(i);
}
//System.out.println(i);//局部代码块中的局部变量i只能在代码块里使用
}
public Pig(){
System.out.println("我是Pig类的无参构造~");
}
public Pig(String s){
System.out.println("我是Pig类的有参构造"+s);
}
public Pig(String food,int age){
System.out.println("我是Pig类的全参构造");
this.food = food;
this.age = age;
}
}
package cn.tedu.opp2;
/*本类用于继承的入门案例*/
public class TestExtents {
public static void main(String[] args) {
//5.分别创建3个类的对象
Animal a = new Animal();
Cat c = new Cat();
MiaoMiao m = new MiaoMiao();
//6.利用对象调用方法进行测试
/*3.继承相当于是子类将父类的功能复制了一份
继承还具有传递性,爷爷的功能会传给爸爸,爸爸的功能会传给孙子
*/
a.eat();//爷爷类使用自己的方法
c.eat();//爸爸类可以使用从爷爷类中继承过来的方法
m.eat();//孙子类也可以使用从爷爷类中继承过来的方法
}
}
/*1.我们通过extends关键字建立子类与父类的继承关系,格式:子类 extends 父类
* 2.Java只支持单继承,一个子类只能有一个父类,但是一个父类可以有多个子类*/
//1.创建小动物类--爷爷类
class Animal{
//4.添加爷爷类的普通方法
public void eat(){
System.out.println("小动物Animal吃啥都行~");
}
}
//2.创建小猫类--父类
/*6.继承是is a 的关系,比如小猫是小动物,MiaoMiao是一只小猫
* 继承要求子类必须是父类的一种下属类型,依赖性非常强,强耦合*/
class Cat extends Animal{
//7.定义爸爸类中的属性
int a = 10;//普通属性
private int b = 100;//私有属性
}
//3.创建MiaoMiao类--孙子类
class MiaoMiao extends Cat{
/*4.子类可以拥有自己独有的方法,实现了功能的拓展,青出于蓝而胜于蓝*/
//8.定义孙子类的方法
public void studyJava(){
System.out.println("正在学java");
System.out.println(a);
/*5.子类继承了父类以后,可以使用父类的所有非私有资源
* 注意:这个私有资源由于被private修饰,所以没有访问权限*/
//System.out.println(b); //不可以,私有资源被限制访问
}
}
package cn.tedu.oop;
/*本类用于this测试*/
public class TestThis1 {
public static void main(String[] args) {
//4.创建对象并调用方法
Cat c = new Cat();
c.eat();
}
}
//1.创建小猫类
class Cat{
//5.创建成员变量
int count = 666;
int sum = 100;
//2.创建方法
public void eat(){
//3.创建局部变量
int sum = 10;
System.out.println(sum);//10使用的是局部变量,就近原则
/*当成员变量与局部变量同名时,可以使用this指定本类的成员变量
如果不使用this指定,打印的就是近处的这个局部变量,就近原则*/
System.out.println(this.sum);//100
System.out.println(count);
}
}
package cn.tedu.oop;
/*本类用于测试this的用法2*/
public class TestThis2 {
public static void main(String[] args) {
//3.1触发无参构造创建本类对象
Dog d1 = new Dog();
//3.2触发有参构造创建本类对象
Dog d2 = new Dog("旺财");
}
}
//1.创建小狗类
class Dog{
//2.1创建本类无参构造
public Dog(){
/*在无参构造中调用含参构造的功能
* 注意:调用是单向的,不能来回双向调用,否则会死循环*/
this("小汪汪~");
System.out.println("我是一个无参构造");
}
//2.2创建本类含参构造String s
public Dog(String s){
/*在含参构造中,调用无参构造的功能
* 规定:this关键字必须在构造函数的第一行*/
//this();
System.out.println("我是一个含参构造"+s);
}
}
package cn.tedu.opp2;
/*本类用于测试继承中变量的使用*/
public class TestExtendsDemo1 {
public static void main(String[] args) {
//7.创建子类的匿名对象,调用study
new Son().study();
}
}
//1.创建父类
class Father{
//3.创建父类的成员变量
int sum = 1;
int count = 2;
}
//2.创建子类
class Son extends Father{
//4.创建子类的成员变量
int sum = 10;
//5.创建子类的普通方法
public void study(){
System.out.println("good good study,day day up!");
//6.创建子类的局部变量
int sum = 100;
//8.打印子类的局部变量sum
System.out.println(sum);//100
//9.打印子类的成员变量sum
System.out.println(this.sum);//10
//10.打印父类的成员变量sum
/*当父类的成员变量与子类的成员变量同名时,可以使类用super指定父的成员变量
我们可以把super看作是父类的对象:Father super = new Father();*/
System.out.println(super.sum);//1
}
}
package cn.tedu.opp2;
/*本类用于测试继承中构造方法的使用
* 1.子类在创建对象时,默认会先调用父类的构造方法
* 2.原因是子类构造函数中的第一行默认存在super();--表示调用父类的无参构造
* 3.当父类的无参构造被覆盖时,可以通过super(参数)调用父类的其他含参构造
* 子类必须调用父类的构造函数,不管是无参还是含参,选一个即可
* 4.构造方法不可以被继承!因为语法的原因:要求构造方法的类名必须是本类类名,
* 不能在子类中出现一个父类名字的构造方法*/
public class ExtendsDemo2 {
public static void main(String[] args) {
//6.1通过父类的无参构造创建父类对象
//Father2 f = new Father2();
//6.通过父类的含参构造创建父类对象
//Father2 f2 = new Father2("哈哈哈");
//7.创建子类对象
Son2 s = new Son2();
}
}
//1.创建父类
class Father2{
//3.创建父类的无参构造
// public Father2(){
// System.out.println("我是父类的无参构造");
// }
//4.创建父类的含参构造
public Father2(String s){
System.out.println("我是父类的含参构造"+s);
}
}
//2.创建子类
class Son2 extends Father2{
//5.创建子类的无参构造
public Son2(){
//super();//调用父类的无参构造
super("您好~");
System.out.println("我是子类的无参构造");
}
}